网上说的很简单的一道树状数组题,昨天学了下树状数组,也确实觉得简单,但是不知道wa了几次,归根结底是没有理解了树状数组统计是从0开始的,而坐标的起点值是0,所有必须让开始变为1,然后再来对树状数组更新。
最初看的时候没有想法主要是局限于对树的概念,树状数组不需要有什么节点,而是以区间来运算的,像这题里边:因为数据输入的时候按升序输入,那么后面的点必然不会为前面的星星加等级,而且后面的星星必然不在前面的之下,所以统计1到x+1之间有多少个星星,即是星星的级别。
code:
#include<iostream>
#include<stdio.h>
using namespace std;
int res[16000],c[33000],n;
int lowbit(int k)
{
return k&(-k);
}
int sum(int k)
{
int t=0;
while(k>0)
{
t+=c[k];
k-=lowbit(k);
}
return t;
}
void change(int k)
{
while(k<=32001)
{
c[k]++;
k+=lowbit(k);
}
}
int main()
{
int x,y,i;
scanf("%d",&n);
for(i=0;i<n;++i)
{
scanf("%d %d",&x,&y);
res[sum(x+1)]++;
change(x+1);
}
for(i=0;i<n;++i)
printf("%d\n",res[i]);
return 0;
}