• HDU 1166 敌兵布阵


    树状数组

    #include <cstdio>
    #include <cstring>
    using namespace std;
    const int N=50010;
    int T,n,cnt=1,x,y;
    char s[6];
    int c[N];
    void init(){for(int i=0;i<N;i++)c[i]=0;}
    void add(int x,int num){while(x<=n)c[x]+=num,x+=x&-x;}
    int sum(int x){int s=0;while(x>0)s+=c[x],x-=x&-x;return s;}
    int main(){
        scanf("%d",&T);
        while(T--){
            init();
            scanf("%d",&n);
            for(int i=1;i<=n;i++){scanf("%d",&x);add(i,x);}
            printf("Case %d:
    ",cnt++);
            while(scanf("%s",s),strcmp(s,"End")){  
                scanf("%d%d",&x,&y);  
                if(strcmp(s,"Add")==0)add(x,y);  
                else if(strcmp(s,"Sub")==0)add(x,-y);  
                else printf("%d
    ",sum(y)-sum(x-1));         
            } 
        }
        return 0;
    }
    

    线段树

    #include <cstdio> 
    #include <cstring>
    const int N=60000;
    int T,n,cnt=1,x,y,sum[N<<2];
    char s[6];
    void init(){for(int i=1;i<N*4;i++)sum[i]=0;}
    void up(int x){sum[x]=sum[x<<1]+sum[x<<1|1];}
    void build(int l,int r,int x){
        if(l==r){scanf("%d",&sum[x]);return;}
        int mid=(l+r)>>1;
        build(l,mid,x<<1); build(mid+1,r,x<<1|1);
        up(x);//注意不要漏写
    }
    void update(int t,int num,int l,int r,int x){
        if(l==r){sum[x]+=num;return;}
        int mid=(l+r)>>1;
        if(t<=mid)update(t,num,l,mid,x<<1);
        else update(t,num,mid+1,r,x<<1|1);
        up(x);//同上
    }
    int query(int L,int R,int l,int r,int x){
        if(L<=l&&r<=R){return sum[x];}
        int mid=(l+r)>>1,tmp=0;
        if(L<=mid)tmp+=query(L,R,l,mid,x<<1);
        if(R>mid)tmp+=query(L,R,mid+1,r,x<<1|1);
        return tmp;
    }
    int main(){
        scanf("%d",&T);
        while(T--){
            init();
            printf("Case %d:
    ",cnt++);
            scanf("%d",&n);
            build(1,n,1);
            while(scanf("%s",s),strcmp(s,"End")){  
                scanf("%d%d",&x,&y);  
                if(strcmp(s,"Add")==0)update(x,y,1,n,1);  
                else if(strcmp(s,"Sub")==0)update(x,-y,1,n,1);  
                else printf("%d
    ",query(x,y,1,n,1));         
            }  
        }
        return 0;
    }
    
  • 相关阅读:
    古谚、评论与论断、名篇与名言
    重读《西游记》
    重读《西游记》
    命名之法 —— 时间、季节、地点
    命名之法 —— 时间、季节、地点
    文言的理解 —— 古时的称谓、别称、别名
    文言的理解 —— 古时的称谓、别称、别名
    Oracle GoldenGate for Oracle 11g to PostgreSQL 9.2.4 Configuration
    瀑布 敏捷 文档
    POJ 1325 ZOJ 1364 最小覆盖点集
  • 原文地址:https://www.cnblogs.com/forever97/p/3567504.html
Copyright © 2020-2023  润新知