HDOJ 1166 敌兵布阵

        今天刚刚学了线段树,原来还有点不理解,毕竟数据结构中的树并没有经常涉及数组,虽然有讲,但已经忘得差不多了。这是我第一个线段树的题目,也是蒋雄学长讲课之后才接触,去了zzy学长的博客,感觉懂了它用数组构造树,和查询的整个过程

        所以对我来说,这道题很好入门的题。

#include<iostream>
using namespace std;
#define MAXN 50005
int cnt[MAXN*4];
void Build(int l,int r,int pt)//pt是数组cnt的下标,从根节点开始 
{
     if( l==r){
         scanf("%d",&cnt[pt]);
         return ;
     }
     int mid=(l+r)>>1;
     Build(l,mid,pt<<1);      //  pt<<1 = 2*pt; 
     Build(mid+1,r,pt<<1|1);    //pt<<1|1 = 2*pt+1 ;
     cnt[pt]=cnt[pt<<1]+cnt[pt<<1|1];
}
void Update(int i,int add,int l,int r,int pt)
{
     if( l==r){
         cnt[pt]+=add;
         return ;
     }
     int mid=(l+r)>>1;
     if(i<=mid)   Update(i,add,l,mid,pt<<1);
     else    Update(i,add,mid+1,r,pt<<1|1);
     cnt[pt]=cnt[pt<<1]+cnt[pt<<1|1];
}
int Query(int L,int R,int l,int r,int pt)
{
    if( L<=l&&R>=r)
        return cnt[pt];
    int sum=0;
    int mid=(l+r)>>1;
    if(L<=mid)   sum+=Query(L,R,l,mid,pt<<1);
    if(R>mid)    sum+=Query(L,R,mid+1,r,pt<<1|1); 
    return sum;
}
int main() 
{
    int i,t,n,c,l,r;
    char cmd[10];
    scanf("%d",&t);
    for( c=1; c<=t; c++){
         memset(cnt,0,sizeof(cnt));
         scanf("%d",&n);
         Build(1,n,1);
         printf("Case %d:\n",c);
         while( true){
                scanf("%s",cmd);
                if( cmd[0]=='E')
                    break;
                if( cmd[0]=='Q'){
                    scanf("%d%d",&l,&r);
                    printf("%d\n",Query(l,r,1,n,1));
                }
                else if( cmd[0]=='A'){
                     scanf("%d%d",&i,&l);
                     Update(i,l,1,n,1);
                }
                else{
                     scanf("%d%d",&i,&l);
                     Update(i,-l,1,n,1);
                }
         }
    }
           
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值