树状数组裸题。
用单点增加操作与区间查询操作即可。处理时别忘了x右移。
代码如下:
#include<bits/stdc++.h>
#define N 32000+10
using namespace std;
int n,x,y;
int c[N],k[N];
void add(int x,int y){
for(;x<=N;x+=x&-x)c[x]+=y;
}
int ask(int x){
int ans=0;
for(;x;x-=x&-x)ans+=c[x];
return ans;
}
int main(){
cin>>n;
memset(c,0,sizeof c);
memset(k,0,sizeof k);
for(int i=1;i<=n;i++){
int t=0;
cin>>x>>y;x++;//x右移
k[ask(x)]++;
add(x,1);
}
for(int i=0;i<=n-1;i++)
cout<<k[i]<<endl;
return 0;
}