hdu1166---敌兵布阵

tips:

  1.递归式返回要加return不能忘,搞懂递归树向下递归时的路径

  2.单点更新,区间查询

//单点更新,区间查询
#include<cstdio>
const int M=50010;
int t;
int n;
char str[10];
struct node{
    int l;
    int r;
    int v;
    int f;
}tree[4*M+1];
int a[M];
int x,y;
void build(int k,int l,int r){
    //存储维护的区间的端点信息
    tree[k].l=l;
    tree[k].r=r;
    if(tree[k].l == tree[k].r){
        scanf("%d",&tree[k].v);
        //tree[k].v=a[l];
        return ;//容易忘,谨记
    }
    int mid=(l+r)>>1;
    build(2*k,l,mid);
    build(2*k+1,mid+1,r);
    tree[k].v=tree[2*k].v+tree[2*k+1].v;
}
//单点更新
void update(int k,int a,int val){
    if(tree[k].l== a && tree[k].r ==a){
        tree[k].v+=val;
        return;
    }
    int mid=(tree[k].l+tree[k].r)>>1;
    if(a<=mid){
        update(2*k,a,val);
    }
    else{
        update(2*k+1,a,val);
    }
    tree[k].v=tree[2*k].v+tree[2*k+1].v;
}
//区间查询
int query(int k,int l,int r){
    if(l== tree[k].l && r== tree[k].r){
        return tree[k].v;
    }
    int mid=(tree[k].l+tree[k].r)>>1;
    if(r<= mid){
       return  query(2*k,l,r);//把return忘了,一直tle
    }
    if(l > mid){
       return query(2*k+1,l,r);
    }
    return query(2*k,l,mid)+query(2*k+1,mid+1,r);
}
int main(){
    while(scanf("%d",&t)!=EOF){
        int xu=0;
        while(t--){
            scanf("%d",&n);
            /*for(int i=1;i<=n;i++){
                scanf("%d",&a[i]);
            }*/
            build(1,1,n);
            printf("Case %d:\n",++xu);
            while(scanf("%s",str)){
                if(str[0] == 'E') break;
                if(str[0] == 'A') {
                    scanf("%d%d",&x,&y);
                    update(1,x,y);
                }
                if(str[0] == 'S'){
                    scanf("%d%d",&x,&y);
                    update(1,x,-y);
                }
                if(str[0] == 'Q'){
                    scanf("%d%d",&x,&y);
                    printf("%d\n",query(1,x,y));
                }
            }
        }
    }
    return 0;
}
View Code

 

posted @ 2018-09-09 15:06  SUMay  阅读(91)  评论(0编辑  收藏  举报