yuhung94

zj c571. 三維偏序問題

Jan 31st, 2023 (edited)
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.92 KB | None | 0 0
  1. //zerojudge c571. 三維偏序問題
  2. #pragma GCC optimzize("Ofast,no-stack-protector")
  3. #include<bits/stdc++.h>
  4. //#define int long long
  5. #define quick ios::sync_with_stdio(0);cin.tie(0);
  6. #define rep(x,a,b) for(int x=a;x<=b;x++)
  7. #define repd(x,a,b) for(int x=a;x>=b;x--)
  8. #define lowbit(x) (x&-x)
  9. #define sz(x) (int)(x.size())
  10. #define F first
  11. #define S second
  12. #define all(x) x.begin(),x.end()
  13. #define mp make_pair
  14. #define eb emplace_back
  15. using namespace std;
  16. typedef complex<int> P;
  17. #define X real()
  18. #define Y imag()
  19. typedef pair<int,int> pii;
  20. void debug(){
  21.     cout<<"\n";
  22. }
  23. template <class T,class ... U >
  24. void debug(T a, U ... b){
  25.     cout<<a<<" ",debug(b...);
  26. }
  27. const int N=2e5+7;
  28. const int INF=1e18;
  29. int bit[N];
  30. //bit
  31. void add(int x,int val){
  32.     for(int i=x;i<N;i+=lowbit(i)){
  33.         bit[i]+=val;
  34.     }
  35. }
  36. int query(int x){
  37.     int sum=0;
  38.     for(;x>0;x-=lowbit(x)){
  39.         sum+=bit[x];
  40.     }
  41.     return sum;
  42. }
  43. int ans[N];
  44. struct node{
  45.     int x,y,z;
  46.     int idx;
  47.     bool operator <(const node&o) const{
  48.         if(x!=o.x) return x>o.x;
  49.         //y,z 排序初始必須與要求相反,才能避免算到非嚴格偏序的
  50.         if(y!=o.y) return y<o.y;
  51.         return z<o.z;
  52.     }
  53. }v[N],v2[N];
  54. void CDQ(int l,int r){//[l,r]
  55.     if(l==r) return ;
  56.     int mid=(l+r)>>1;
  57.     CDQ(l,mid);
  58.     CDQ(mid+1,r);
  59.     int a=l,b=mid+1;
  60.     int st=l;
  61.     stack<pii> undo;
  62.     while(a<=mid||b<=r){
  63.         if(a<=mid&&(b>r||v[a].y>v[b].y)){
  64.             //put a
  65.             add(v[a].z,1);
  66.             undo.push(mp(v[a].z,1));
  67.             v2[st++]=v[a++];
  68.         }
  69.         else{
  70.             //put b
  71.             ans[v[b].idx]+=query(N-1)-query(v[b].z);
  72.             v2[st++]=v[b++];
  73.         }
  74.     }
  75.     //Undo
  76.     while(undo.size()){
  77.         pii now=undo.top();
  78.         undo.pop();
  79.         add(now.F,-now.S);
  80.     }
  81.     //update
  82.     rep(i,l,r){
  83.         v[i]=v2[i];
  84.     }
  85. }
  86. signed main(){
  87.     quick
  88.     int n;
  89.     cin>>n;
  90.     rep(i,1,n){
  91.         cin>>v[i].x>>v[i].y>>v[i].z;
  92.         v[i].idx=i;
  93.     }
  94.     sort(v+1,v+n+1);
  95.     CDQ(1,n);
  96.     rep(i,1,n) cout<<ans[i]<<"\n";
  97.     //ans[i]-> pair's of j that x[i]>x[j],y[i]>y[j],z[i]>z[j]
  98.     return 0;
  99. }
  100.  
Tags: CDQ
Add Comment
Please, Sign In to add comment