您的位置:首页 > 其它

2016春季训练——树状数组

2016-03-07 20:14 274 查看
来源:HDU1556

树状数组的使用,以前写过一个类似的,但是并没有练得很熟,所以今天再重新找一个题目练一下

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN=100010;
long long c[MAXN];
int n,t;
long long lowbit(int n){
return n&(-n);
}
void update(int i,int d){
while(i<=n){
c[i]+=d;
i=i+lowbit(i);
}
}
long long query(int n){
long long ans=0;
while(n>0){
ans+=c
;
n-=lowbit(n);
}
return ans;
}
int main(){
int a,b;
while(scanf("%d",&n)!=EOF){
if(n==0)break;
memset(c,0,sizeof(c));
int i=0;
while(i++<n){
cin>>a>>b;
if(a>b){t=a;a=b;b=t;}
update(a,1);//这方法好,一开始使用a到b来进行遍历,但是后来发现这是需要维护a,b之外的数据的,这个方法非常好
update(b+1,-1);
}
for(i=1;i<n;i++)
cout<<query(i)<<" ";
cout<<query(n)<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: