HDU 1166 敌兵布阵 线段树

  题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166

  题目描述:中文题, 没啥说的, 更新+查询

  解题思路:最简单的线段树, 就是套板子的题, 单点更新, 线段树的坑才刚刚开, 没啥可讲的, 就是熟悉一下线段树的板子

  代码: 

#include <cstdio>
#define lson l, m, rt << 1
#define rson m+1, r, rt << 1 | 1

const int MAXN = 55555;
int sum[MAXN<<2];

void PushUp(int rt) {
    sum[rt] = sum[rt<<1] + sum[rt<<1|1];
}
void build(int l, int r, int rt) {
    if( l == r ) {
        scanf("%d", &sum[rt]);
        return;
    }
    int m = (l+r)>>1;
    build(lson);
    build(rson);
    PushUp(rt);
}

void update(int p, int add, int l, int r, int rt) {
    if(l == r) {
        sum[rt] += add;
        return;
    }
    int m = (l+r)>>1;
    if(p <= m) update(p, add, lson);
    else update(p, add, rson);
    PushUp(rt);
}

int query(int L, int R, int l, int r, int rt) {
    if(L <= l && r <= R) {
        return sum[rt];
    }
    int m = (l+r)>>1;
    int ret = 0;
    if( L <= m ) ret += query(L, R, lson);
    if( R > m ) ret += query(L, R, rson);
    return ret;
}

int main() {
    int T, n;
    scanf( "%d", &T );
    for( int cas = 1; cas <= T; cas++ ) {
        printf( "Case %d:\n", cas );
        scanf( "%d", &n );
        build( 1, n, 1 );
        char op[10];
        while( scanf( "%s", op ) ) {
            if( op[0] == 'E' ) break;
            int a, b;
            scanf( "%d%d", &a, &b );
            if( op[0] == 'Q' ) {
                printf( "%d\n", query(a, b, 1, n, 1) );
            }
            else if( op[0] == 'S' ) update( a, -b, 1, n, 1 );
            else update(a, b, 1, n, 1);
        }
    }
    return 0;
}
View Code

  思考: 刚刚参加完了陕西西安的ACM邀请赛, 拿了铜牌, 但是我觉得真的很侥幸, 因为就是快手二题, 真的是水, 所以应该开新坑, 我现在就在开线段树的新坑, 同时我要复习dp,争取对更复杂的dp有一个更加深入的了解

posted on 2017-05-24 15:58  FriskyPuppy  阅读(144)  评论(0编辑  收藏  举报

导航