首页 > 代码库 > HDU 1166(线段树单点更新)
HDU 1166(线段树单点更新)
HDU 1166
题意:1-n个堡垒,人数在不断变化,多次查询 l-r人数和;
思路:线段树的单点更新;
#include<iostream> #include<cstring> #include<cstdio> #include<string> #include<algorithm> #include<cmath> #include<map> #include<vector> #include<queue> #define INF 0x3fffffff #define MAXN 50001 #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 using namespace std; 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); } 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 query(int L,int R,int l,int r,int rt) { if(L<=l&&r<=R) return sum[rt]; int m=(r+l)>>1; int ret=0; if(L<=m) ret+=query(L,R,lson); if(m<R) ret+=query(L,R,rson); return ret; } int main() { int T; scanf("%d",&T); for(int cas=1;cas<=T;cas++) { int n; char op[10]; int a,b; scanf("%d",&n); build(1,n,1); printf("Case %d:\n",cas); while(scanf("%s",op),strcmp(op,"End")) { scanf("%d%d",&a,&b); if(op[0]=='Q') printf("%d\n",query(a,b,1,n,1)); else if(op[0]=='A') update(a,b,1,n,1); else update(a,-b,1,n,1); } } return 0; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。