zoukankan      html  css  js  c++  java
  • /* (线段树)带点更新(累加),求部分线段和 */

    /* 带点更新(累加),求部分线段和 */
    /*(1) Add i j,i和j为正整数,表示第i个营地增加j个人(j不超过30)
    (2)Sub i j ,i和j为正整数,表示第i个营地减少j个人(j不超过30);
    (3)Query i j ,i和j为正整数,i<=j,表示询问第i到第j个营地的总人数;
    (4)End 表示结束,这条命令在每组数据最后出现;*/
    #include<cstdio>
    #include<cstring>
    #define maxn 50010
    
    typedef struct node{
        int sum ;
        int l , r  ;
    }Lnode;
    
    Lnode tree[maxn*4] ;
    int ans ;
    int num[maxn] ;
    
    void bulid(int root , int ll , int rr){
        if(ll == rr){
            tree[root].l = tree[root].r = ll ;
            tree[root].sum = num[ll] ;
            return;
        }
        tree[root].l = ll ;
        tree[root].r = rr ;
        int mid = (ll+rr)/2 ;
        bulid(root*2 , ll , mid) ;
        bulid(root*2+1 , mid+1 , rr) ;
        tree[root].sum = tree[root*2].sum + tree[root*2+1].sum ;
    }
    
    void update(int root , int pos , int value){
        if(tree[root].l == pos&&tree[root].r == pos){
            tree[root].sum+=value ;
            return;
        }
        int mid = (tree[root].l+tree[root].r)/2 ;
        if(pos <= mid)
            update(root*2 , pos , value) ;
        else update(root*2+1 , pos , value) ;
        
        tree[root].sum = tree[root*2].sum + tree[root*2+1].sum ;
    }
    
    void query(int root , int s , int e){
        int mid = (tree[root].l + tree[root].r)/2 ;
        if(tree[root].l==s&&tree[root].r==e){
            ans += tree[root].sum ;
        }
        else if(s>mid)
            query(root*2+1 , s , e) ;
        else if(e<=mid)
            query(root*2 , s , e ) ;
        else if(s<=mid&&mid<=e){ // 此处 if可去掉
            query(root*2 , s , mid) ;
            query(root*2+1 , mid+1 , e) ;
        }
    }
    int main(){
        int t , cas=0 ;
        int n,x,y ;
        char str[10] ;
        scanf("%d" , &t) ;
        while(t--){
            scanf("%d" , &n) ;
            for(int i=1 ; i<=n ; i++)
                scanf("%d" , &num[i]) ;
                
            bulid(1,1,n) ;
            printf("Case %d:
    " , ++cas) ;
            while(~scanf("%s" , str),str[0]!='E'){
                scanf("%d%d" , &x , &y) ;
                if(str[0] == 'Q'){
                    ans = 0 ;
                    query(1 , x , y ) ;
                    printf("%d
    " , ans) ;
                }
                else if(str[0] == 'A'){
                    update(1 , x, y) ;
                }
                else if(str[0] == 'S'){
                    update(1 , x, -y) ;
                }
            }
        }
        return 0 ;
    }
  • 相关阅读:
    .IllegalArgumentException: Mapped Statements collection does not contain 异常一例【我】
    Spring配置文件里加载路径中的通配符
    线程池使用Callable示例【我】
    使用Callable和Future接口创建线程
    Java线程池(Callable+Future模式)
    集合切割
    draw call 理解和优化
    Unity 3d导入3dMax模型 产生若干问题
    3dmax做的模型导入U3d后 当模型靠近摄像机时镂空问题
    不管多少个空格替换为一个空格
  • 原文地址:https://www.cnblogs.com/yi-ye-zhi-qiu/p/7702747.html
Copyright © 2011-2022 走看看