cdq分治

 

 

 

 

 

 

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=1e5+11,M=5e5+11;
 4 int n,m,S,c[M],pri[N];
 5 inline int re_ad() {
 6     char ch=getchar(); int x=0,f=1;
 7     while(ch<'0' || ch>'9') { if(ch=='-') f=-1; ch=getchar(); }
 8     while('0'<=ch && ch<='9') x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
 9     return x*f;
10 }
11 struct Node {
12     int x,y,z,cnt,ans;
13     bool operator == (const Node &B) const { return (x==B.x) && (y==B.y) && (z==B.z); }
14     bool operator < (const Node &B) const { if(x!=B.x) return x<B.x; else return y!=B.y?y<B.y:z<B.z; }
15 }a[N],t[N];
16 inline bool cmp(Node A,Node B) { return A.y!=B.y?A.y<B.y:A.z<B.z; }
17 
18 inline int lowbit(int d) { return d&(-d); }
19 inline void Insert(int d,int x) { for(;d<=S;d+=lowbit(d)) c[d]+=x; }
20 inline int Query(int d) { int res=0; for(;d;d-=lowbit(d)) res+=c[d]; return res; }
21 
22 void CdqSolve(int l,int r) {
23     if(l==r) return;
24     int mid=(l+r)>>1,i=l,j=mid+1;
25     CdqSolve(l,mid),CdqSolve(mid+1,r);
26     sort(a+l,a+mid+1,cmp),sort(a+mid+1,a+r+1,cmp);
27     for(;j<=r;++j) {
28         for(;i<=mid && a[i].y<=a[j].y;++i) Insert(a[i].z,a[i].cnt);
29         a[j].ans+=Query(a[j].z);
30     }
31     for(int j=l;j<i;++j) Insert(a[j].z,-a[j].cnt);
32 }
33 
34 int main()
35 {
36     m=re_ad(),S=re_ad();
37     for(int i=1;i<=m;++i) t[i].x=re_ad(),t[i].y=re_ad(),t[i].z=re_ad();
38     sort(t+1,t+m+1);
39     for(int i=1;i<=m;++i) {
40         if(t[i]==t[i-1]) ++a[n].cnt;
41         else a[++n]=t[i],a[n].cnt=1;
42     }
43     CdqSolve(1,n);
44     for(int i=1;i<=n;++i) pri[a[i].ans+a[i].cnt-1]+=a[i].cnt;
45     for(int i=0;i<m;++i) printf("%d\n",pri[i]); puts("");
46 //    for(int i=1;i<=n;++i) printf("%d: %d %d %d %d %d\n",i,a[i].x,a[i].y,a[i].z,a[i].cnt,a[i].ans);
47     return 0;
48 }

 

posted @ 2021-09-23 23:14  上官书房  阅读(56)  评论(0)    收藏  举报