zoukankan      html  css  js  c++  java
  • Hdu 1166

    hdu1166-敌兵布阵

    题意:

    读入一个数组,完成单点加,单点减,和区间求和三种操作。

    解法:

    明摆着的一颗线段树,SB题。

    CODE:

    #pragma GCC optimize(2)
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    
    using namespace std;
    
    #define LL long long
    #define N 100010
    
    struct Tree {
        int lson,rson;
        int sum,tag;
    }tree[N * 2];
    
    int n,cnt = 1,a[N],ans,T,test;
    char s[N];
    
    inline int read(){
        int x = 0,f = 1;
        char ch = getchar();
        while(ch<'0'||ch>'9') {if(ch == '-') f = -1; ch = getchar();}
        while(ch>='0'&&ch<='9') {x = (x << 1) + (x << 3) + (ch ^ 48);ch = getchar();}
        return x * f;
    }
    inline void pushup(int x) {
        tree[x].sum = tree[tree[x].lson].sum + tree[tree[x].rson].sum;
    }
    inline void pushdown(int x,int l,int r) {
        int mid = (l + r) >> 1;
        tree[tree[x].lson].sum += (mid - l + 1) * tree[x].tag;
        tree[tree[x].lson].tag += tree[x].tag;
        tree[tree[x].rson].sum += (r - mid) * tree[x].tag;
        tree[tree[x].rson].tag += tree[x].tag;
        tree[x].tag = 0;
    }
    void build(int x,int l,int r) {
        if(l == r) {
            tree[x].sum = a[l];
            return;
        }
        int mid = (l + r) >> 1;
        tree[x].lson = ++cnt;
        build(tree[x].lson,l,mid);
        tree[x].rson = ++cnt;
        build(tree[x].rson,mid+1,r);
        pushup(x);
    }
    void update(int x,int l,int r,int k,int v) {
        if(l == r) {
            tree[x].sum += v;
            return;
        }
        int mid = (l + r) >> 1;
        if(k <= mid) update(tree[x].lson,l,mid,k,v);
        else update(tree[x].rson,mid+1,r,k,v);
        pushup(x);
    }
    int query(int x,int l,int r,int ll,int rr) {
        if(l == ll && r == rr) return tree[x].sum;
        int mid = (l + r) >> 1;
        pushdown(x,l,r);
        if(rr <= mid) return query(tree[x].lson,l,mid,ll,rr);
        else if(ll > mid) return query(tree[x].rson,mid+1,r,ll,rr);
        else return query(tree[x].lson,l,mid,ll,mid) + query(tree[x].rson,mid+1,r,mid+1,rr);
    }
    
    int main() {
        T = read();
        while(T--) {
            test++;
            n = read();
            for(int i = 1 ; i <= n ; i++)
                a[i] = read();
            build(1,1,n);
            printf("Case %d:
    ",test);
            while(true) {
                scanf("%s",s+1);
                if(s[1] == 'E') break;
                if(s[1] == 'A') {
                    int i = read() , j = read();
                    update(1,1,n,i,j);
                }
                if(s[1] == 'S') {
                    int i = read() , j = read();
                    update(1,1,n,i,-j);
                }
                if(s[1] == 'Q') {
                    int i = read() , j = read();
                    printf("%d
    ",query(1,1,n,i,j));
                }
            }
        }
        //system("pause");
        return 0;
    }
    
  • 相关阅读:
    Java 二维数组
    JAVA——运算符
    JAVA——类与对象
    Eclipse无法自动编译出class文件 转
    引导入单用户模式
    安装sql server遇到问题解决方法
    数据结构和算法分析学习
    开源软件
    POP3、SMTP、IMAP和Exchange都是个什么玩意?
    邮件相关名词 MUA, MTA
  • 原文地址:https://www.cnblogs.com/Repulser/p/11396819.html
Copyright © 2011-2022 走看看