例题
Link.
代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int n,k,N,ans[2000005];
struct zz{
int x,y,z,ans,tot;
}a[100005],b[100005];
bool cmp(zz x,zz y){ return x.x==y.x?(x.y==y.y?x.z<y.z:x.y<y.y):x.x<y.x; }
bool smp(zz x,zz y){ return x.y==y.y?x.z<y.z:x.y<y.y; }
int Lowbit(int x){ return x&(-x);}
struct Bit_Tree{
ll bit[4000005];
int Lowbit(int x){ return x&(-x); }
void Insert(int x,ll val){ for(int i=x;i<=k;i+=Lowbit(i)) bit[i]+=val; }
ll Find(int x){ ll ans=0; for(int i=x;i;i-=Lowbit(i)) ans+=bit[i]; return ans; }
}T;
void CDQ(int l,int r){
if(r<=l) return ;
int mid=(l+r)>>1;
CDQ(l,mid),CDQ(mid+1,r);
sort(a+l,a+mid+1,smp),sort(a+mid+1,a+r+1,smp);
int p=l,q=mid+1;
while(q<=r){
while(p<=mid&&a[p].y<=a[q].y) T.Insert(a[p].z,a[p].tot),p++;
a[q].ans+=T.Find(a[q].z);q++;
}
for(int i=l;i<=p-1;i++) T.Insert(a[i].z,-a[i].tot);
}
int main(){
cin>>N>>k;
for(int i=1;i<=N;i++) scanf("%d%d%d",&b[i].x,&b[i].y,&b[i].z);
sort(b+1,b+N+1,cmp);
for(int i=1;i<=N;i++){
int now=1;
while(b[i].x==b[i+1].x&&b[i].y==b[i+1].y&&b[i].z==b[i+1].z) now++,i++;
n++,a[n]=b[i],a[n].tot=now;
}
CDQ(1,n);
for(int i=1;i<=n;i++) ans[a[i].ans+a[i].tot-1]+=a[i].tot;
for(int i=0;i<N;i++) printf("%d\n",ans[i]);
return 0;
}