标签:线段树
线段树水题,练习一下线段树的写法
虽然我的写法和网上大多数的写法不同,但感觉我这种写法更好理解,写起来也更简便
单点更新
#include<stdio.h> #define N 50005 struct Node{ int l,r,sum; }t[N<<2]; int n; void build(int cur,int l,int r){ t[cur].l=l; t[cur].r=r; t[cur].sum=0; if(l==r) return; int mid=(l+r)>>1; build(cur*2,l,mid); build(cur*2+1,mid+1,r); } void update(int cur,int i,int num) { if(t[cur].r<i||t[cur].l>i) return; if(t[cur].l<=i&&t[cur].r>=i){ t[cur].sum+=num; } if(t[cur].l==t[cur].r) { return; } update(cur*2,i,num); update(cur*2+1,i,num); } int query(int i,int l,int r){ if(t[i].r<l||t[i].l>r) return 0; if(t[i].l>=l&&t[i].r<=r) { return t[i].sum; } return query(i*2,l,r)+query(i*2+1,l,r); } int main(){ #ifndef ONLINE_JUDGE freopen("in.txt","r",stdin); #endif int t; char s[20]; scanf("%d",&t); int cas=1; while(t--){ scanf("%d",&n); build(1,1,n); int tmp; for(int i=1;i<=n;i++) { scanf("%d",&tmp); update(1,i,tmp); } printf("Case %d:\n",cas++); int tmp1,tmp2; while(scanf("%s",s)){ if(s[0]=='Q'){ scanf("%d%d",&tmp1,&tmp2); printf("%d\n",query(1,tmp1,tmp2)); } else if(s[0]=='A'){ scanf("%d%d",&tmp1,&tmp2); update(1,tmp1,tmp2); } else if(s[0]=='S'){ scanf("%d%d",&tmp1,&tmp2); update(1,tmp1,-tmp2); } else break; } } return 0; }
标签:线段树
原文地址:http://blog.csdn.net/lj94093/article/details/45747715