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 }

浙公网安备 33010602011771号