hdu 1166-敌兵布阵 线段树

来源:互联网 发布:刘知白山水画 编辑:程序博客网 时间:2024/06/06 07:07

线段树写法。。。还在研究线段树中。。

#include <iostream>#include <cstdio>#include <cmath>#include <cstring>#include <algorithm>#include <queue>#include <vector>#define maxn 50500using namespace std;int a[maxn];int  tree[maxn*4];void pushup(int pos){tree[pos]=tree[pos*2]+tree[pos*2+1];//二叉树 }void buildtree(int l,int r,int pos){if(l==r){tree[pos]=a[l];return ;}int mid=l+(r-l)/2;buildtree(l,mid,pos*2);buildtree(mid+1,r,2*pos+1);pushup(pos);}void update(int x,int k,int l,int r,int pos){if(l==r){tree[pos]+=k;return ;}int mid=l+(r-l)/2;if(x<=mid){update(x,k,l,mid,2*pos);} else{update(x,k,mid+1,r,2*pos+1);}pushup(pos);} int query(int ql,int qr,int l,int r,int pos){if(ql<=l&&qr>=r){return tree[pos];}int mid=l+(r-l)/2;int sum=0;if(ql<=mid){sum+=query(ql,qr,l,mid,2*pos);}if(qr>mid){sum+=query(ql,qr,mid+1,r,2*pos+1);}return sum;}int main(){int t,n;int p,q;char s[1001];scanf("%d",&t);for(int k=1;k<=t;k++){scanf("%d",&n);memset(a,0,sizeof(a));for(int i=1;i<=n;++i){scanf("%d",&a[i]);}buildtree(1,n,1);printf("Case %d:\n",k);//getchar();while(scanf("%s",&s)!=EOF){if(s[0]=='E'){break;}if(s[0]=='S'){scanf("%d%d",&p,&q);update(p,-q,1,n,1);}if(s[0]=='A'){scanf("%d%d",&p,&q);update(p,q,1,n,1);}if(s[0]=='Q'){scanf("%d%d",&p,&q);printf("%d\n",query(p,q,1,n,1));}}}return 0;}


0 0
原创粉丝点击