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 ;
    }
  • 相关阅读:
    tableView的高度问题
    信任机型
    cell 内部 设置width 总不对
    图文混排
    UICollectionview实现自定义cell的移动删除
    ios 各种技术
    打包ane之后在FB上生成ipa的阶段错误
    自动布局出代码植入 的图像化实例
    MapReduce编程实例
    二叉树的遍历(递归遍历、非递归遍历、层序遍历)
  • 原文地址:https://www.cnblogs.com/yi-ye-zhi-qiu/p/7702747.html
Copyright © 2011-2022 走看看