简单线段树,以前做过一样的题。唯一的问题是很久没写,忘记数组要开MAX<<2了,wa在#9。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define N 50000
int n;
int sum[N<<2];
int r[N];
void Insert(int s,int l,int r,int rt)
{
sum[rt]++;
if(l==r)return ;
int m=(l+r)>>1;
if(s<=m)Insert(s,lson);
else Insert(s,rson);
}
int query(int s,int l,int r,int rt)
{
if(l==r)return sum[rt];
int m=(l+r)>>1;
if(s<=m)return query(s,lson);
else return query(s,rson)+sum[rt<<1];
}
int main()
{
memset(sum,0,sizeof(sum));
memset(r,0,sizeof(r));
scanf("%d",&n);
int x,y;
for(int i=1;i<=n;i++)
{
scanf("%d%d",&x,&y);
r[query(x,1,40000,1)]++;
Insert(x,1,40000,1);
}
for(int i=0;i<n;i++)
printf("%d\n",r[i]);
return 0;
}