本题对于我而言,一开始不知道如何把树状数组建立在问题上,其实对于一个问题,经过一定的处理后,可以直接套用树状数组,只要满足其性质,可以通过树状数组的操作解决即可。
因为题目的数据是已经有顺序的,所以只要以star 的横坐标为数组的下标建立树状数组即可,同时因为x>=0,所以在操作前,x++。
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int N=15005;
const int M=32003;
int level[N],tree[M];//数组是以横坐标为下标
int n;
void update(int p,int c)
{
while(p<=M)//此时数组的大小是变化的,因此用最大的
{
tree[p]+=c;
p+=(p&-p);
}
}
int query(int p)
{
int sum=0;
while(p)
{
sum+=tree[p];
p-=(p&-p);
}
return sum;
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
int x,y;
memset(level,0,sizeof(level));
memset(tree,0,sizeof(tree));
for(int i=1;i<=n;i++)
{
scanf("%d%d",&x,&y);//树状数组从1开始,x++
level[query(++x)]++;//先查询后修改,因为不包括自身
update(x,1);
}
for(int i=0;i<=n-1;i++)
printf("%d\n",level[i]);
}
return 0;
}