题目链接:http://poj.org/problem?id=2352
题目大意:
给你星星的坐标(y递增,若y相等,x递增),每个星星都有一个等级,规定它的等级就是在它左下方的星星的个数。输入所有星星后,依次输出等级为0到n-1的星星的个数。
解题思路:
就是统计x前面比它小的星星的个数,符合树状数组最基本的应用。
注意的是:树状数组下标为0的位置不可用,所以我们需要在输入x坐标时+1.
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int tree[32005],level[15005];
int lowbit(int x)
{
return x&-x;
}
void refresh(int x)
{
int i;
for(i=x; i<=32004; i+=lowbit(i))
tree[i]++;
}
int sum(int x)
{
int i,N=0;
for(i=x; i>=1; i=i-lowbit(i))
N+=tree[i];
return N;
}
int main()
{
int x,y,n,i;
memset(tree,0,sizeof(tree));
memset(level,0,sizeof(level));
scanf("%d",&n);
for(i=1; i<=n; i++)
{
scanf("%d%d",&x,&y);
x++;
level[sum(x)]++;
refresh(x);
}
for(i=0; i<n; i++)
printf("%d\n",level[i]);
return 0;
}