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

来源:互联网 发布:linux查看cpu核数命令 编辑:程序博客网 时间:2024/06/05 14:55

这道题是很简单的树状数组和线段树的题目,理解一下树状数组怎么用~

#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的性质,写起来比线段树方便写~~

0 0
原创粉丝点击