您的位置:首页 > 其它

HDU 1166 敌兵布阵 树状数组-(模板)

2016-09-20 16:29 337 查看
这道题是很简单的树状数组和线段树的题目,理解一下树状数组怎么用~

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;

int n,num[50050];

int lowbit(int t) {
return t & (-t);
}

void add(int t,int number) {
while(t <= n) {
num[t] += number;
t += lowbit(t);
}
}

int getsum(int t) {
int sum = 0;
while(t > 0) {
sum += num[t];
t -= lowbit(t);
}
return sum;
}

int main() {
int t,cnt = 1;
scanf("%d",&t);
while(t--) {
printf("Case %d:\n",cnt++);
scanf("%d",&n);
int x,a,b;
for(int i = 1;i <= n;i++) {
scanf("%d",&x);
add(i,x);
}
char str[20];
while(scanf("%s",str) && str[0] != 'E') {
scanf("%d%d",&a,&b);
if(str[0] == 'A')
add(a,b);
else if(str[0] == 'S')
add(a,-b);
else
printf("%d\n",getsum(b) - getsum(a-1)); //这里注意减去后面的前缀和是a-1!
}
}
}


主要就是利用了lowbit的性质,写起来比线段树方便写~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  树状数组 算法