dreamxr
精诚所至,金石为开!

导航

 

【题目描述】

给定一些点的坐标(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;
}

  

posted on 2012-08-01 22:44  dreamxr  阅读(98)  评论(0)    收藏  举报