zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    3月18
    线段树求后继+环——cf1237D
    排序+stl——cf1237C
    思维+双指针+环——cf1244F
    模拟+双指针——cf1244E
    树的性质——cf1244D
    数学思维——cf1244C
    树的直径变形——cf1238F
    ac自动机暴力跳fail匹配——hdu5880
    状态压缩dp增量统计贡献——cf1238E(好题)
  • 原文地址:https://www.cnblogs.com/forever97/p/3567504.html
Copyright © 2011-2022 走看看