Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- #include<vector>
- #include<algorithm>
- using namespace std;
- using ll=long long;
- int merge_sort(vector<int>& v,int l,int r){
- // base case
- if(r-l<=1) return 0;
- int m=(l+r)/2;
- // recursive
- ll ret=0;
- ret+=merge_sort(v,l,m);
- ret+=merge_sort(v,m,r);
- // copy
- static vector<int> tmp;
- tmp.resize(v.size());
- copy(v.begin()+l,v.begin()+r,tmp.begin()+l);
- // merge
- int ptr=l,lptr=l,rptr=m;
- while(lptr<m&&rptr<r)
- if(tmp[lptr]<=tmp[rptr]){
- v[ptr++]=tmp[lptr++];
- ret+=rptr-m;
- }else
- v[ptr++]=tmp[rptr++];
- while(lptr<m){
- v[ptr++]=tmp[lptr++];
- ret+=rptr-m;
- }
- while(rptr<r) v[ptr++]=tmp[rptr++];
- return ret;
- }
- void solve(){
- int n;cin>>n;
- vector<int> v(n);
- for(auto& i:v)
- cin>>i;
- cout<<merge_sort(v,0,n)<<endl;
- }
- int main(){
- solve();
- return 0;
- }
Add Comment
Please, Sign In to add comment