您的位置:首页 > 其它

HDU 1556(树状数组 区域更新,单点求值)

2016-12-04 18:43 288 查看
链接:点击打开链接

//区域更新,单点求值  树状数组区间修改+单点查询的入门题,每次更新区间[l,r]的时候,给区间左端点l处往后更新+1,右端点后r+1处往后更新减1,这样,最后求i位置的值,只要从左往右求一遍前缀和,小于l的位置都没有增量,l到r之间会有增量1,r之后+1,-1相互抵消也没有增量。  具体推出的过程不得而知......
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
#define MAXN 100001
int tree[MAXN];
int n;
int LowBit(int t){
return t&(-t);
}
void Add(int t,int d)
{
while(t<=n){
tree[t]+=d;
t+=LowBit(t);
}
}
int Get(int t)
{
int sum=0;
while(t>0){
sum+=tree[t];
t-=LowBit(t);
}
return sum;
}
int main()
{
while(cin>>n,n){
int a,b;
memset(tree,0,sizeof(tree));
for(int i=1;i<=n;i++){
scanf("%d%d",&a,&b);
Add(a,1);
Add(b+1,-1);
}
for(int j=1;j<=n;j++)
printf("%d%c",Get(j),j==n?'\n':' ');
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: