hdu 1541

因为y的输入是从小到大,所以不用考虑y坐标的问题

只考虑x坐标就行

还有个小细节就是0<=x,y,<=32000  x和y取0的时候树状数组处理不到 

x++就行了

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
const int maxn = 32005;
int a[maxn];
int c[maxn];
int getsum(int i);
void add(int i,int k);
int main()
{
    int n,j,i,k,x,y;
    while(scanf("%d",&n) != EOF)
    {
        memset(c, 0, sizeof(c));
        memset(a, 0, sizeof(a));
        for(i=0;i<n;++i)
        {
            scanf("%d%d",&x,&y);
            x ++;
            a[getsum(x)]++;
            add(x,1);
        }
        for(i=0;i<n;++i)
            printf("%d\n",a[i]);
    }
}
int lowbit(int k)
{
    return k&(-k);
}
int getsum(int i)
{
    int sum = 0;
    while(i > 0)
    {
        sum += c[i];
        i-=lowbit(i);
    }
    return sum;
}
void add(int i,int k)
{
    while(i <= 32000)
    {
        c[i]+=k;
        i+=lowbit(i);
    }
}

猜你喜欢

转载自www.cnblogs.com/mltang/p/8979661.html