题目链接:HDU1166
1 10 1 2 3 4 5 6 7 8 9 10 Query 1 3 Add 3 6 Query 2 7 Sub 10 2 Add 6 3 Query 3 10 End
Case 1: 6 33 59
题目分析:线段树留个模板。
// // main.cpp // HDU1166(2) // // Created by teddywang on 16/4/19. // Copyright © 2016年 teddywang. All rights reserved. // #include <iostream> #include<cstdio> #include<cstring> #include<algorithm> #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 using namespace std; int n,T; int sum[200010]; void pushup(int rt) { sum[rt]=sum[rt<<1]+sum[rt<<1|1]; } void add(int a,int b,int l,int r,int rt) { if(l==r) { sum[rt]+=b; return ; } int m=(l+r)>>1; if(a<=m) add(a,b,lson); else add(a,b,rson); pushup(rt); } 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 ans=0; if(L<=m) ans+=query(L,R,lson); if(R>m) ans+=query(L,R,rson); return ans; } int main() { scanf("%d",&T); for(int x=1;x<=T;x++) { scanf("%d",&n); build(1,n,1); printf("Case %d:\n",x); char s[10]; while(scanf("%s",s)) { if(s[0]=='E')break; int a,b; scanf("%d%d",&a,&b); if(s[0]=='Q') printf("%d\n",query(a,b,1,n,1)); else if(s[0]=='S') add(a,-b,1,n,1); else add(a,b,1,n,1); } } }