【题目描述】
给定一些点的坐标(x,y),定义某个点的level为在这个点左下方点的个数,输出每个level的点的个数。
【分析】
水题
y的坐标已经按照递增的顺序给出,所以不用考虑y的大小,每次插入时只判断比x小的点的个数即可。
#include<cstdio>
#include<cstring>
#define N 33000
#define lson l,m,n<<1
#define rson m+1,r,n<<1|1
using namespace std;
int s[N<<2];
int ans[N];
void build(int l,int r,int n){
s[n]=0;
if(l==r)return;
int m=(l+r)>>1;
build(lson);
build(rson);
}
void update(int nn,int l,int r,int n){
s[n]++;
if(l==r)
return;
int m=(l+r)>>1;
if(nn<=m)
update(nn,lson);
else
update(nn,rson);
}
int query(int ll,int rr,int l,int r,int n){
if(ll==l&&rr==r)
return s[n];
int m=(l+r)>>1;
if(rr<=m)
return query(ll,rr,lson);
else if(ll>m)
return query(ll,rr,rson);
else
return query(ll,m,lson)+query(m+1,rr,rson);
}
int main(){
int n;
while(~scanf("%d",&n)){
build(1,N,1);
memset(ans,0,sizeof(ans));
for(int i=1;i<=n;i++){
int x,y;
scanf("%d%d",&x,&y);
x++;
ans[query(1,x,1,N,1)]++;;
update(x,1,N,1);
}
for(int i=0;i<n;i++)
printf("%d\n",ans[i]);
}
return 0;
}
浙公网安备 33010602011771号