http://poj.org/problem?id=2352
题目描述的很多,但是与 y 没有关系。
只需要求出 每一个x 前小于 x 的数的个数就是该星星是第几级
用树状数组的时候要注意 x == 0 的情况,在update() 函数中,当x 等于0 的时候 while 循环 不会结束,会出现超时
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
int a[16000],b[16000],c[40000],d[40000],n,maxx;
int lowbit(int x)
{
return x & (-x);
}
void update(int x,int y)
{
while(x <= maxx)
{
c[x] += y;
x += lowbit(x);
}
}
int getsum(int x)
{
int tmp = x;
int res = 0;
while(x > 0)
{
res += c[x];
x -= lowbit(x);
}
return res;
}
int main()
{
while(~scanf("%d",&n))
{
memset(c,0,sizeof(c));
memset(d,0,sizeof(d));
int i,j,num;
maxx = 0;
for(i = 1; i <= n;i++)
{
scanf("%d%d",&a[i],&b[i]);
a[i]+= 1;
maxx = max(maxx,a[i]);
}
for(i = 1; i <= n; i++)
{
num = getsum(a[i]);
update(a[i],1);
d[num]++;
}
for(i = 0; i < n; i++)
printf("%d\n",d[i]);
}
return 0;
}