konchin_shih

inversion count

May 8th, 2023
268
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.92 KB | None | 0 0
  1. #include<iostream>
  2. #include<vector>
  3. #include<algorithm>
  4. using namespace std;
  5. using ll=long long;
  6. int merge_sort(vector<int>& v,int l,int r){
  7. // base case
  8.     if(r-l<=1) return 0;
  9.     int m=(l+r)/2;
  10. // recursive
  11.     ll ret=0;
  12.     ret+=merge_sort(v,l,m);
  13.     ret+=merge_sort(v,m,r);
  14. // copy
  15.     static vector<int> tmp;
  16.     tmp.resize(v.size());
  17.     copy(v.begin()+l,v.begin()+r,tmp.begin()+l);
  18. // merge
  19.     int ptr=l,lptr=l,rptr=m;
  20.     while(lptr<m&&rptr<r)
  21.         if(tmp[lptr]<=tmp[rptr]){
  22.             v[ptr++]=tmp[lptr++];
  23.             ret+=rptr-m;
  24.         }else
  25.             v[ptr++]=tmp[rptr++];
  26.     while(lptr<m){
  27.         v[ptr++]=tmp[lptr++];
  28.         ret+=rptr-m;
  29.     }
  30.     while(rptr<r) v[ptr++]=tmp[rptr++];
  31.     return ret;
  32. }
  33. void solve(){
  34.     int n;cin>>n;
  35.     vector<int> v(n);
  36.     for(auto& i:v)
  37.         cin>>i;
  38.     cout<<merge_sort(v,0,n)<<endl;
  39. }
  40. int main(){
  41.     solve();
  42.     return 0;
  43. }
Add Comment
Please, Sign In to add comment