第二题ac代码: #include <bits/stdc++.h> using namespace std; long long f[30], e[30]; int a[1050000]; void divide(int l, int r,int x); int main(){     int n, m;     scanf("%d", &n);     m = pow(2,n);          for (int i=0; i<m; ++i){         scanf("%d", &a[i]);     }          divide(0,m,n);          int t, p;     long long ans;     scanf("%d", &t);     while (t--){         scanf("%d", &p);         for (int i=1; i<=p; ++i)             f[i] = pow(2,i+n-2) - e[i] - f[i];         ans = 0;         for (int i=1; i<=n; ++i){             ans += f[i];         }         cout << ans << endl;     }      } void divide(int l, int r,int x){     if (x==0){         return;     }           int mid = (l+r) / 2;     divide(l,mid,x-1);     divide(mid,r,x-1);          int nowp = mid;     for (int i=l; i<mid; i++){         while (nowp < r && a[nowp] < a[i]) nowp++;         f[x] += (nowp-mid);     }          int i=l, j=mid, ri, rj;     while (i<mid && j<r){         if (a[i] == a[j]){             ri = rj = 1;             while (ri+i < mid && a[ri+i] == a[i]) ri++;             while (rj+j < r && a[rj+j] == a[j]) rj++;             e[x] += ri * rj;             i += ri;             j += rj;             continue;         }         if (a[i] > a[j]) j++;         else i++;     }          vector<int> v;     i=l;      j=mid;     while (i<mid || j<r){         if (i==mid) {             v.push_back(a[j++]);             continue;         }         if (j==r) {             v.push_back(a[i++]);             continue;         }         if (a[i] < a[j])             v.push_back(a[i++]);         else             v.push_back(a[j++]);     }     for (int i=l; i<r; ++i)         a[i] = v[i-l];          }
点赞 1

相关推荐

牛客网
牛客企业服务