konchin_shih

cdq

Oct 17th, 2022
808
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.12 KB | None | 0 0
  1. void cdq(V<point>& v,int l,int r){
  2.     if(r-l==1) return;
  3.     int m=(l+r)>>1;
  4.     cdq(v,l,m),cdq(v,m,r);
  5.     node* root=nullptr;
  6.     for(int lp=l,rp=m;rp<r;rp++){
  7.         while(lp<m&&v[lp].y>v[rp].y){
  8.             node *tl,*tr;
  9.             split(root,v[lp].z,tl,tr);
  10.             root=merge(merge(tl,new node(v[lp].z)),tr);
  11.             lp++;
  12.         }
  13.         node *tl,*tr;
  14.         split(root,v[rp].z,tl,tr);
  15.         v[rp].ans+=(tl?tl->sz:0);
  16.         root=merge(tl,tr);
  17.     }
  18.     static V<point> tmp;
  19.     tmp.resize(v.size());
  20.     copy(v.cbegin()+l,v.cbegin()+r,tmp.begin()+l);
  21.     int lp=l,rp=m;
  22.     while(lp<m&&rp<r)
  23.         if(tmp[lp].y>tmp[rp].y)
  24.             v[l++]=tmp[lp++];
  25.         else
  26.             v[l++]=tmp[rp++];
  27.     while(lp<m)
  28.         v[l++]=tmp[lp++];
  29.     while(rp<r)
  30.         v[l++]=tmp[rp++];
  31. }
  32. inline void solve(){
  33.     int n;cin>>n;
  34.     V<point> v(n);
  35.     for(int i=0;i<n;i++)
  36.         v[i].i=i,cin>>v[i].x>>v[i].y>>v[i].z;
  37.     sort(v.begin(),v.end());
  38.     cdq(v,0,n);
  39.     sort(v.begin(),v.end(),[](point a,point b){
  40.         return a.i<b.i;
  41.     });
  42.     for(auto i:v)
  43.         cout<<i.ans<<endl;
  44. }
Advertisement
Add Comment
Please, Sign In to add comment