Infiniti

   :: 首页  :: 新随笔  ::  ::  :: 管理

HDU - 1541 

思路:二维偏序,一维排序,一维树状数组查询即可。

#include<bits/stdc++.h>
using namespace std;
#define maxn 33333
int ans[maxn],n,sum[maxn];
int lowbit(int x)
{
    return x&(-x);
}
struct node
{
    int x,y;
    bool operator < (const node &b)const
    {
        if(x==b.x)return y<b.y;
        return x<b.x;
    }
} a[maxn];
void add(int x,int d)
{
    while(x<=32001)
    {
        sum[x]+=d;
        x+=lowbit(x);
    }
}
int getsum(int x)
{
    int ret=0;
    while(x>0)
    {
        ret+=sum[x];
        x-=lowbit(x);
    }
    return ret;
}
int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        memset(sum,0,sizeof(sum));
        memset(ans,0,sizeof(ans));
        for(int i=1; i<=n; i++)
            scanf("%d%d",&a[i].x,&a[i].y);
        sort(a+1,a+1+n);
        for(int i=1; i<=n; i++)
        {
            ans[getsum(a[i].y+1)]++;
            add(a[i].y+1,1);
        }
        for(int i=0; i<n; i++)printf("%d\n",ans[i]);
    }
    return 0;
}

  

 

posted on 2019-01-13 20:53  自由缚  阅读(193)  评论(0编辑  收藏  举报