#include <bits/stdc++.h>
using namespace std;
const int MX=(1<<20);
int n,n2,i,a[42],b[42],c[MX],r[42];
long long x[42],res[42];
void rec(int l, int cnt, int inv, long long mask) {
if (inv>r[n-l+cnt]) return;
if (l==n) {
if (inv<r[cnt]) {
r[cnt]=inv;
res[cnt]=1;
} else ++res[cnt];
return;
}
int cur=(b[l]<=n2)?c[x[l]&mask]:(cnt-c[mask>>b[l]]);
rec(l+1,cnt+1,inv+cur,mask|(1LL<<b[l]));
rec(l+1,cnt,inv,mask);
}
int main() {
for (i=1; i<MX; i++) c[i]=c[i/2]+(i&1);
scanf("%d",&n); n2=n/2;
for (i=1; i<=n; i++) r[i]=n*n;
for (i=0; i<n; i++) {
scanf("%d",&a[i]);
b[n-a[i]]=i;
x[n-a[i]]=(1LL<<i)-1;
}
rec(0,0,0,0);
for (i=1; i<=n; i++) cout<<r[i]<<' '<<res[i]<<'\n';
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | #include <bits/stdc++.h> using namespace std; const int MX=(1<<20); int n,n2,i,a[42],b[42],c[MX],r[42]; long long x[42],res[42]; void rec(int l, int cnt, int inv, long long mask) { if (inv>r[n-l+cnt]) return; if (l==n) { if (inv<r[cnt]) { r[cnt]=inv; res[cnt]=1; } else ++res[cnt]; return; } int cur=(b[l]<=n2)?c[x[l]&mask]:(cnt-c[mask>>b[l]]); rec(l+1,cnt+1,inv+cur,mask|(1LL<<b[l])); rec(l+1,cnt,inv,mask); } int main() { for (i=1; i<MX; i++) c[i]=c[i/2]+(i&1); scanf("%d",&n); n2=n/2; for (i=1; i<=n; i++) r[i]=n*n; for (i=0; i<n; i++) { scanf("%d",&a[i]); b[n-a[i]]=i; x[n-a[i]]=(1LL<<i)-1; } rec(0,0,0,0); for (i=1; i<=n; i++) cout<<r[i]<<' '<<res[i]<<'\n'; return 0; } |
English