#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; } |