#include <stdio.h>
#include <string.h>
#define MAX 32010
int lev[MAX],c[MAX];
int Lowbit(int x)
{
return x & (-x);
}
void Updata(int x)
{
while( x < MAX )
{
c[x]++;
x += Lowbit(x);
}
}
int Getsum(int x)
{
int sum = 0;
while( x > 0 )
{
sum += c[x];
x -= Lowbit(x);
}
return sum;
}
int main()
{
int n,x,y,i;
while( ~scanf("%d",&n) )
{
memset(lev,0,sizeof(lev));
memset(c,0,sizeof(c));
for(i=1; i<=n; i++)
{
scanf("%d%d",&x,&y);
x++;
lev[Getsum(x)]++;
Updata(x);
}
for(i=0; i<n; i++)
printf("%d\n",lev[i]);
}
return 0;
}
转载于:https://www.cnblogs.com/You-Change/p/3531768.html
本文介绍了一种使用树状数组进行区间更新与查询的高效算法。通过定义Lowbit函数来获取当前数的最低位1,实现Updata函数进行区间更新操作,以及Getsum函数进行区间求和操作。主函数中,首先初始化lev和c数组,然后读取输入数据,调用Updata函数更新树状数组,并使用Getsum函数统计每个区间的元素数量。
&spm=1001.2101.3001.5002&articleId=102432886&d=1&t=3&u=43b51efc8c414fa6a1c8542b7a3eecce)
1519

被折叠的 条评论
为什么被折叠?



