Advertisement
RaFiN_

merge sort child inversions

Feb 12th, 2019
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.59 KB | None | 0 0
  1.  
  2.  
  3.  
  4. ll inv1[MAX],inv2[MAX];int flag[MAX],arr[MAX];vi v[4*MAX];
  5.  
  6. void Build(int node,int b,int e,int lev)
  7. {
  8.     if(b==e)
  9.     {
  10.         v[node].pb(arr[b]);
  11.         return ;
  12.     }
  13.     int mid = (b+e)>>1;
  14.     int left = 2*node;
  15.     int right = left + 1;
  16.     Build(2*node,b,mid,lev+1);
  17.     Build(2*node+1,mid+1,e,lev+1);
  18.     ll l = 0,r = 0,cnt = 0;
  19.     while(l<v[left].size()&&r<v[right].size())
  20.     {
  21.         int x = min(v[left][l],v[right][r]);ll cx = 0,cy = 0;
  22.         while(l<v[left].size()&&v[left][l]==x)cx++,l++;
  23.         while(r<v[right].size()&&v[right][r]==x)cy++,r++;
  24.         inv2[lev]+=(cx * (v[right].size() - r));
  25.         inv1[lev]+=(cy * (v[left].size() - l));
  26.         for(int i = 0;i<cx+cy;i++)v[node].pb(x);
  27.     }
  28.     while(l<v[left].size())
  29.     {
  30.         v[node].pb(v[left][l++]);
  31.     }
  32.     while(r<v[right].size())
  33.     {
  34.         v[node].pb(v[right][r++]);
  35.     }
  36.     ///cout<<"node "<<node<<" "<<inv1[lev]<<" "<<inv2[lev]<<endl;;
  37.    /// for(int i = 0;i<v[node].size();i++)cout<<v[node][i]<<" ";cout<<endl;
  38. }
  39.  
  40.  
  41.  
  42. int main()
  43. {
  44.     ///booster()
  45.     ///read("input.txt");
  46.  
  47.     int n;
  48.     scani(n);
  49.     int m = 1<<n;
  50.     for(int i = 1;i<=m;i++)scani(arr[i]);
  51.  
  52.     Build(1,1,m,0);
  53.  
  54.     ///for(int i = 0;i<=n;i++)cout<<inv1[i]<<" "<<inv2[i]<<endl;
  55.  
  56.     int q;
  57.     scani(q);
  58.     while(q--)
  59.     {
  60.         int pk;
  61.         scani(pk);
  62.         pk = n - pk;
  63.         ll ans = 0;
  64.         for(int i = pk;i<n;i++)
  65.         {
  66.             swap(inv1[i],inv2[i]);
  67.         }
  68.         for(int i = 0;i<n;i++)ans+=inv1[i];
  69.         printf("%I64d\n",ans);
  70.     }
  71.  
  72.     return 0;
  73. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement