很简单的线段树,询问区间和,贴个代码
ACcode:
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
using std::sort;
const int nsize=155555;
int x[nsize],y[nsize];
int X[nsize];
int num[nsize];
int tre[nsize<<2];
void update(int rt,int l,int r,int pos)
{
if (l==r)
{
tre[rt]++;
return ;
}
int m=(l+r)>>1;
if (pos<=m) update(rt<<1,l,m,pos);
else update(rt<<1|1,m+1,r,pos);
tre[rt]=tre[rt<<1]+tre[rt<<1|1];
}
int query(int rt,int l,int r,int L,int R)
{
if (L<=l&&r<=R) return tre[rt];
int m=(l+r)>>1,ans=0;
if (L<=m) ans+=query(rt<<1,l,m,L,R);
if (R>m) ans+=query(rt<<1|1,m+1,r,L,R);
return ans;
}
int Fin(int key,int len)
{
int l=0,r=len;
while (l<=r)
{
int m=(l+r)>>1;
if (X[m]>key) r=m-1;
else if (X[m]<key) l=m+1;
else return m;
}
return -1;
}
int main()
{
int n,m,i,pos,k;
while (~scanf("%d",&n))
{
for (i=0;i<n;i++) scanf("%d %d",&x[i],&y[i]),X[i]=x[i];
sort(X,X+n);
for (m=0,i=1;i<n;i++) if (X[i]!=X[i-1]) X[++m]=X[i];
memset(tre,0,sizeof(tre));
memset(num,0,sizeof(num));
for (i=0;i<n;i++)
{
pos=Fin(x[i],m);
// printf("pos[%d]=%d\n",i,pos);
k=query(1,0,m,0,pos);
num[k]++;
update(1,0,m,pos);
}
for (i=0;i<n;i++) printf("%d\n",num[i]);
}
return 0;
}