hdu 1166
题意: 给一组数,然后给多组询问,query(x,y)表示求x到y的数和,add(x,y)表示x上的数加上y,sub(x,y)表示x上的数减去y。
这道题和1698的那题相似,只不过1698的是区间更新,处理要加一个lazy标记,这道题就不用,只是简单的点更新,比1698容易
这两道题的代码很相似吧。。。。反正我写的差不多
这里我贴下1698的链接:
AC代码:
#include <iostream> #include <stdio.h> using namespace std; const int Max = 50010; struct S { int l,r,sum; }s[Max*4]; int num[Max]; int ans; void build(int i,int l,int r) { s[i].l = l; s[i].r = r; if(l==r) { s[i].l = s[i].r = l; s[i].sum = num[l]; return; } int m = (l+r)>>1; build(i<<1,l,m); build((i<<1)+1,m+1,r); s[i].sum = s[i<<1].sum + s[(i<<1)+1].sum; } void update(int i,int index,int v) { int m = (s[i].l+s[i].r)>>1; if(s[i].l==index&&s[i].r==index) { s[i].sum += v; return; } if(m>=index) update(i<<1,index,v); else update((i<<1)+1,index,v); s[i].sum = s[i<<1].sum + s[(i<<1)+1].sum; } void query(int i,int index,int v) { int m = (s[i].l+s[i].r)>>1; if(s[i].l==index&&s[i].r==v) ans += s[i].sum; else if(m>=v) query(i<<1,index,v); else if(m<index) query((i<<1)+1,index,v); else { query(i<<1,index,m); query((i<<1)+1,m+1,v); } } int main() { int t,k=0,n,x,y,i; char str[100]; scanf("%d",&t); while(t--) { scanf("%d",&n); for(i=1;i<=n;i++) scanf("%d",&num[i]); build(1,1,n); printf("Case %d:\n",++k); while(scanf("%s",str)!=EOF) { if(str[0]=='E') break; else { scanf("%d%d",&x,&y); if(str[0] == 'Q') { ans = 0; query(1,x,y); printf("%d\n",ans); } else if(str[0] == 'A') update(1,x,y); else if(str[0] == 'S') update(1,x,-y); } } } }