Timus 1028

一看题意,感觉可以用线段树来做,但是二维挺难处理的,后来百度了一下,大牛们是将二维化为一维,因为点已经排好了序,我们就可以省去了一维,只考虑x,然后就是赤裸裸的线段树了,而且还不用事先建树。

#include<iostream>

#include<cstdio>

#include<cstring>

using namespace std;

struct node

{

    int x,y;

}point[15010];

int res[15010],tree[32000*4+10];

int insert(int i,int left,int right,int x)

{

    int mid;

    if(left==right) return tree[i]++;

    tree[i]++;

    mid=(left+right)>>1;

    if(x <= mid) return insert(i*2,left,mid,x);

    return insert(i*2+1,mid+1,right,x)+tree[i*2];

}

int main()

{

    int i,n,k,xmax;

    while(scanf("%d",&n)!=EOF)

    {

        memset(res,0,sizeof(res));

        memset(tree,0,sizeof(tree));

        xmax=0;

        for(i=0;i<n;i++)

        {

            scanf("%d %d",&point[i].x,&point[i].y);

            xmax = xmax < point[i].x ? point[i].x : xmax;

        }

        for(i=0;i<n;i++)

        {

            k=insert(1,0,xmax,point[i].x);

            res[k]++;

        }

        for(i=0;i<n;i++) printf("%d\n",res[i]);

    }

    return 0;

}

你可能感兴趣的:(IM)