树状数组第一题。磕磕碰碰,照写人家的代码,和配合大牛博文的解析,终于差不多全理解的数组数组到底怎么一回事情了。
据说,树状数组的题目,都可以那线段树来写,以后也那线段树来写一下这个题目。
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define N 32020
int lev[N];
int c[N]; //树状数组
int Lowbit(int x)
{
return x&(-x);
}
void Updata(int x)
{
while(x<N) //更新,进行从叶子节点,沿着所在的路径一种更新到更节点
{ //时间的复杂度为log(n)
c[x]++;
x+=Lowbit(x);
}
}
int Gsum(int x)
{
int sum=0;
while(x>0)
{
sum+=c[x]; //求前面star的个数 时间复杂度为log(n)
x-=Lowbit(x); //求得前面一颗子树根的下标
}
return sum;
}
int main()
{
int n,i,x,y;
while(scanf("%d",&n)!=EOF)
{
memset(lev,0,sizeof(lev));
memset(c,0,sizeof(c));
for(int i=0;i<n;i++)
{
scanf("%d%d",&x,&y);
x++;
lev[Gsum(x)]++;
Updata(x);
}
for(int i=0;i<n;i++)
{
printf("%d\n",lev[i]);
}
}
return 0;
}