HDU 1166 敌兵布阵(线段树)(第一部分 单点更新)

来源:互联网 发布:北京旅游酒店推荐知乎 编辑:程序博客网 时间:2024/06/04 04:54

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166

题目大意:有n个营地  然后给出每个营地的人数

接下来每行有一条命令,命令有4种形式:
(1) Add i j,i和j为正整数,表示第i个营地增加j个人(j不超过30)
(2)Sub i j ,i和j为正整数,表示第i个营地减少j个人(j不超过30);
(3)Query i j ,i和j为正整数,i<=j,表示询问第i到第j个营地的总人数;
(4)End 表示结束,这条命令在每组数据最后出现;

思路:基础线段树

#include<iostream>#include<cmath>#include<cstdio>#include<iomanip>#include<cstring>#include<stdlib.h>#include<string>#include<algorithm>#include<queue>using namespace std;#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1const int  maxn =51000;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);}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;}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 main(){int t,n;scanf("%d",&t);for(int cas=1;cas<=t;cas++){printf("Case %d:\n",cas);scanf("%d",&n);build(1,n,1);char op[10];while(~scanf("%s",op)){if(op[0]=='E')break;int a,b;scanf("%d%d",&a,&b);if(op[0]=='Q')//访问{printf("%d\n",query(a,b,1,n,1));}else if(op[0]=='S'){update(a,-b,1,n,1);}elseupdate(a,b,1,n,1);}}}


阅读全文
0 0
原创粉丝点击