hdu1166---敌兵布阵

tips:

  1.c[i]数组每次结束后要清零---update的更新方式决定的(c[i]+=v)

  2.c[i]记录的是在i号位之前(含i号位)lowbit(i)个数的和

  3.单点更新,区间查询,可以不用lazy标记和线段树

  4.对知识的理解是会随着时间的增加而加深的,不过自己要投入思考。

//hdu支持万能头文件
//本来想用线段树呢,结果一直re呀o(╥﹏╥)o
//索性就来试试树状数组,毕竟树状数组也是第一写
#include<cstdio>
#include<iostream>
using namespace std;
const int M=50010;
int c[M];
int t;int n;
int lowbit(int x){
    return x&-x;
}
void update(int x,int v){
    for(int i=x;i<=n;i+=lowbit(i)){
        c[i]+=v;
    }
}
int getsum(int x){
    int sum=0;
    for(int i=x;i>0;i-=lowbit(i)){
        sum+=c[i];
    }
    return sum;
}
int main(){
    scanf("%d",&t);
    int xu=1;
    while(t--){
        scanf("%d",&n);
        fill(c,c+n+1,0);//没有这个会wa这是为什么呢
        //知道了,采用的update的更新方式,如果不清零,会有上次的影响
        for(int i=1;i<=n;i++){
            int v;
            scanf("%d",&v);
            update(i,v);
        }
        c[0]=0;
        char p[10] ;
        int x,y;
        printf("Case %d:\n",xu++);
        while(cin>>p && p[0]!= 'E'){
            //if(p[0]=='E') break;
            cin>>x>>y;
            if(p[0] == 'Q'){

                printf("%d\n",getsum(y)-getsum(x-1));
            }
            if(p[0]== 'A'){
                update(x,y);
            }
            if(p[0] == 'S'){
                update(x,-y);
            }
        }
    }
    return 0;
}
View Code

 

posted @ 2018-08-16 20:03  SUMay  阅读(110)  评论(0编辑  收藏  举报