入门参考博客
模板题
POJ2352
题目分析
参考题解
树状数组用来横坐标存小于等于x的星星的数量。因为输入是按照按照y递增,如果y相同则x递增的顺序给出的, 所以,对于第i颗星星,它的level就是之前出现过的星星中,横坐标x小于等于i星横坐标的那些星星的总数量(前面的y一定比后面的y小)。
代码
#include<iostream>
#include<cstdio>
using namespace std;
int lv[32005],c[32005];
int lowbit(int t)//lowbit函数
{
return t&(-t);
}
void update(int x,int y)//更新数组
{
for(int i=x;i<=32005;i+=lowbit(i))
{
c[i]+=y;
}
}
int sum(int x)//查询数组
{
int ans=0;
for(int i=x;i>0;i-=lowbit(i))
{
ans+=c[i];
}
return ans;
}
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
lv[sum(++x)]++;
update(x,1);
}
for(int i=0;i<n;i++) printf("%d\n",lv[i]);
return 0;
}