题目:BZOJ3262.
这只是个用来屯板子的blog,原文.
代码如下:
#include<bits/stdc++.h>
using namespace std;
#define Abigail inline void
typedef long long LL;
const int N=100000,M=200000;
int n,m;
struct question{
int x,y,z,cnt,ans;
bool operator == (const question &p)const{return x==p.x&&y==p.y&&z==p.z;}
}q[N+9],t[N+9];
int cq,ans[N+9];
bool cmp1(const question &a,const question &b){return a.x<b.x||a.x==b.x&&(a.y<b.y||a.y==b.y&&a.z<b.z);}
bool cmp2(const question &a,const question &b){return a.y<b.y||a.y==b.y&&a.z<b.z;}
int c[M+9];
void Add(int p,int v){if (!p) return;for (;p<=m;p+=p&-p) c[p]+=v;}
int Query(int p){int res=0;for (;p;p-=p&-p) res+=c[p];return res;}
void Divide(question *q,int L,int R){
if (L==R) return;
int mid=L+R>>1,j=L;
Divide(q,L,mid);
Divide(q,mid+1,R);
sort(q+L,q+mid+1,cmp2);
sort(q+mid+1,q+R+1,cmp2);
for (int i=mid+1;i<=R;++i){
for (;j<=mid&&q[j].y<=q[i].y;++j) Add(q[j].z,q[j].cnt);
q[i].ans+=Query(q[i].z);
}
for (int i=L;i<j;++i) Add(q[i].z,-q[i].cnt);
}
Abigail into(){
scanf("%d%d",&n,&m);
for (int i=1;i<=n;++i)
scanf("%d%d%d",&q[i].x,&q[i].y,&q[i].z);
}
Abigail work(){
sort(q+1,q+1+n,cmp1);
for (int i=1;i<=n;++i)
if (q[cq]==q[i]) ++q[cq].cnt;
else q[++cq]=q[i],q[cq].cnt=1;
Divide(q,1,cq);
for (int i=1;i<=cq;++i)
ans[q[i].ans+q[i].cnt-1]+=q[i].cnt;
}
Abigail outo(){
for (int i=0;i<n;++i)
printf("%d\n",ans[i]);
}
int main(){
into();
work();
outo();
return 0;
}