HDOJ 1166 敌兵布阵

来源:互联网 发布:java杨辉三角形代码 编辑:程序博客网 时间:2024/06/05 23:39

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

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

#include<iostream>using namespace std;#define MAXN 50005int 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;}


原创粉丝点击