标签:des style color java os io strong 数据
解题报告
题意:
略
思路:
线段树单点增减和区间求和。
#include <iostream> #include <cstring> #include <cstdio> #define LL long long using namespace std; int sum[201000]; void update(int root,int l,int r,int p,int v) { int mid=(l+r)/2; if(l==r)sum[root]+=v; else if(l<r) { if(p<=mid)update(root*2,l,mid,p,v); else update(root*2+1,mid+1,r,p,v); sum[root]=sum[root*2]+sum[root*2+1]; } } int q_sum(int root,int l,int r,int ql,int qr) { int mid=(l+r)/2,ans=0; if(ql<=l&&r<=qr)return sum[root]; if(ql<=mid)ans+=q_sum(root*2,l,mid,ql,qr); if(mid<qr)ans+=q_sum(root*2+1,mid+1,r,ql,qr); return ans; } int main() { int n,i,j,a,q,t,k=1; int ql,qr; char str[100]; scanf("%d",&t); while(t--) { memset(sum,0,sizeof(sum)); scanf("%d",&n); for(i=0; i<n; i++) { scanf("%d",&a); update(1,1,n,i+1,a); } printf("Case %d:\n",k++); while(~scanf("%s",str)) { if(str[0]=='E') break; scanf("%d%d",&ql,&qr); if(str[0]=='A') { update(1,1,n,ql,qr); } else if(str[0]=='S') { update(1,1,n,ql,-qr); } else if(str[0]=='Q') printf("%d\n",q_sum(1,1,n,ql,qr)); } } return 0; }
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
HDU1166_敌兵布阵(线段树/单点更新),布布扣,bubuko.com
标签:des style color java os io strong 数据
原文地址:http://blog.csdn.net/juncoder/article/details/38425497