hdu1166---敌兵布阵
tips:
1.递归式返回要加return不能忘,搞懂递归树向下递归时的路径
2.单点更新,区间查询
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
//单点更新,区间查询 #include<cstdio> const int M=50010; int t; int n; char str[10]; struct node{ int l; int r; int v; int f; }tree[4*M+1]; int a[M]; int x,y; void build(int k,int l,int r){ //存储维护的区间的端点信息 tree[k].l=l; tree[k].r=r; if(tree[k].l == tree[k].r){ scanf("%d",&tree[k].v); //tree[k].v=a[l]; return ;//容易忘,谨记 } int mid=(l+r)>>1; build(2*k,l,mid); build(2*k+1,mid+1,r); tree[k].v=tree[2*k].v+tree[2*k+1].v; } //单点更新 void update(int k,int a,int val){ if(tree[k].l== a && tree[k].r ==a){ tree[k].v+=val; return; } int mid=(tree[k].l+tree[k].r)>>1; if(a<=mid){ update(2*k,a,val); } else{ update(2*k+1,a,val); } tree[k].v=tree[2*k].v+tree[2*k+1].v; } //区间查询 int query(int k,int l,int r){ if(l== tree[k].l && r== tree[k].r){ return tree[k].v; } int mid=(tree[k].l+tree[k].r)>>1; if(r<= mid){ return query(2*k,l,r);//把return忘了,一直tle } if(l > mid){ return query(2*k+1,l,r); } return query(2*k,l,mid)+query(2*k+1,mid+1,r); } int main(){ while(scanf("%d",&t)!=EOF){ int xu=0; while(t--){ scanf("%d",&n); /*for(int i=1;i<=n;i++){ scanf("%d",&a[i]); }*/ build(1,1,n); printf("Case %d:\n",++xu); while(scanf("%s",str)){ if(str[0] == 'E') break; if(str[0] == 'A') { scanf("%d%d",&x,&y); update(1,x,y); } if(str[0] == 'S'){ scanf("%d%d",&x,&y); update(1,x,-y); } if(str[0] == 'Q'){ scanf("%d%d",&x,&y); printf("%d\n",query(1,x,y)); } } } } return 0; }