现在的位置: 首页 > 综合 > 正文

hdu 1166 敌兵布阵 (线段树)

2012年05月28日 ⁄ 综合 ⁄ 共 1380字 ⁄ 字号 评论关闭

http://acm.hdu.edu.cn/showproblem.php?pid=1166

最基础的线段树,单点更新。完全跟着HH的代码风格写的。

code:

#include<cstdio>
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
const int maxn = 50005 ;
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=1, T, n, i, j, a, b ;
    char str[10] ;
    scanf("%d", &T) ;
    while(T--){
        scanf("%d", &n) ;
        build(1, n, 1) ;
        printf("Case %d:\n", t++) ;
        while(1){
            scanf("%s", str) ;
            if(str[0]=='E'break ;
            scanf("%d%d", &a, &b) ;
            if(str[0]=='A') update(a, b, 1, n, 1) ;
            else if(str[0]=='S') update(a, -b, 1, n, 1) ;
            else printf("%d\n", query(a, b, 1, n, 1)) ;
        }
    }
    return 0 ;} 

抱歉!评论已关闭.