zoukankan      html  css  js  c++  java
  • HDU 1166 敌兵布阵

    线段树,单点更新求区间和

    /* ***********************************************
    Author        :Zhou Zhentao
    Email         :774388357@qq.com
    Created Time  :2015/11/20 17:21:35
    File Name     :acm.cpp
    ************************************************ */
    
    #include <stdio.h>
    #include <string.h>
    #include <iostream>
    #include <algorithm>
    #include <vector>
    #include <queue>
    #include <set>
    #include <map>
    #include <string>
    #include <math.h>
    #include <stdlib.h>
    #include <time.h>
    using namespace std;
    
    #define lson l , m , rt << 1    
    #define rson m + 1 , r , rt << 1 | 1   
    #define root 1 , N , 1   
    #define LL long long    
    const int maxn = 50000+10;    
    LL add[maxn<<2];    
    LL sum[maxn<<2];    
    void PushUp(int rt) {    
        sum[rt] = sum[rt<<1] + sum[rt<<1|1];    
    }    
    void PushDown(int rt,int m) {    
        if (add[rt]) {    
            add[rt<<1] += add[rt];    
            add[rt<<1|1] += add[rt];    
            sum[rt<<1] += add[rt] * (m - (m >> 1));    
            sum[rt<<1|1] += add[rt] * (m >> 1);    
            add[rt] = 0;    
        }    
    }    
    void build(int l,int r,int rt) {    
        add[rt] = 0;    
        if (l == r) {    
            scanf("%lld",&sum[rt]);    
            return ;    
        }    
        int m = (l + r) >> 1;    
        build(lson);    
        build(rson);    
        PushUp(rt);    
    }    
    void update(int L,int R,int c,int l,int r,int rt) {    
        if (L <= l && r <= R) {    
            add[rt] += c;    
            sum[rt] += (LL)c * (r - l + 1);    
            return ;    
        }    
        PushDown(rt , r - l + 1);    
        int m = (l + r) >> 1;    
        if (L <= m) update(L , R , c , lson);    
        if (m < R) update(L , R , c , rson);    
        PushUp(rt);    
    }    
    LL query(int L,int R,int l,int r,int rt) {    
        if (L <= l && r <= R) {    
            return sum[rt];    
        }    
        PushDown(rt , r - l + 1);    
        int m = (l + r) >> 1;    
        LL ret = 0;    
        if (L <= m) ret += query(L , R , lson);    
        if (m < R) ret += query(L , R , rson);    
        return ret;    
    }    
    int main() {    
        int N , Q,T;
        scanf("%d",&T);
        for(int Case=1;Case<=T;Case++){
            memset(add,0,sizeof add);
            memset(sum,0,sizeof sum);
            scanf("%d",&N);
            for(int i=1;i<=N;i++)
            {
                int x;
                scanf("%d",&x);
                update(i , i , x , root); 
            }
    
            char op[10];
            printf("Case %d:
    ",Case);
            while (1) 
            {     
                int a , b , c;    
                scanf("%s",op);    
                if(strcmp(op,"End")==0) break;
                if (op[0] == 'Q') {    
                    scanf("%d%d",&a,&b);    
                    printf("%lld
    ",query(a , b ,root));    
                } else if(op[0] == 'A'){    
                    scanf("%d%d%d",&a,&c);    
                    update(a , a , c , root);    
                }  
                else {
                    scanf("%d%d%d",&a,&c);    
                    update(a , a , -c , root); 
                }
            }    
        }
        return 0;    
    }    
  • 相关阅读:
    Bit Manipulation
    218. The Skyline Problem
    Template : Two Pointers & Hash -> String process
    239. Sliding Window Maximum
    159. Longest Substring with At Most Two Distinct Characters
    3. Longest Substring Without Repeating Characters
    137. Single Number II
    142. Linked List Cycle II
    41. First Missing Positive
    260. Single Number III
  • 原文地址:https://www.cnblogs.com/zufezzt/p/4982902.html
Copyright © 2011-2022 走看看