hdu1166 敌兵布阵(线段树)

本文介绍了一种使用段式树状数组实现的数据结构,并提供了详细的C语言代码示例。该数据结构支持快速查询和更新操作,适用于解决区间加法和区间求和问题。文章通过一个具体的例子展示了如何构建段式树、执行加法操作以及查询区间和。
View Code
#include<stdio.h>
#include<string.h>
const  int MAXN=50005;
struct ty{
    int l,r;
    int num;
};
int num[MAXN];
ty dat[MAXN*3];

int Build(int a,int b,int i){
    dat[i].l=a;
    dat[i].r=b;
    if(a==b) return dat[i].num=num[a];
    int mid=(a+b)>>1;
    return dat[i].num=Build(a,mid,i<<1)+Build(mid+1,b,i<<1|1);
}

void Add(int a,int b,int i){
    dat[i].num+=b;
    if(dat[i].l==a && dat[i].r==a) return;
    int mid=(dat[i].l+dat[i].r)>>1;
    if(a<=mid) Add(a,b,i<<1);
    else Add(a,b,i<<1|1);
}

int Query(int a,int b,int i){
    if(dat[i].l==a && dat[i].r==b) return dat[i].num;
    int mid=(dat[i].l+dat[i].r)>>1;
    if(b<=mid) return Query(a,b,i<<1);
    else if(a>mid) return Query(a,b,i<<1|1);
    else return Query(a,mid,i<<1)+Query(mid+1,b,i<<1|1);
}
int main(){
    //freopen("in.txt","r",stdin);
    int t,index,n,a,b;
    char cmd[16];
    scanf("%d",&t);
    for(index=1;index<=t;index++){
        printf("Case %d:\n",index);
        scanf("%d",&n);
        int i;
        for(i=1;i<=n;i++){
            scanf("%d",num+i);
        }
        Build(1,n,1);
        while(scanf("%s",cmd),cmd[0]!='E'){
            scanf("%d%d",&a,&b);
            if(cmd[0]=='A') Add(a,b,1);
            else if(cmd[0]=='S') Add(a,-b,1);
            else printf("%d\n",Query(a,b,1));
        }
    }
    return 0;
}

 

转载于:https://www.cnblogs.com/sumaoqing123/archive/2012/12/09/2810485.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值