标签:
ACM大牛的线段树总结。看完就懂了。(代码也是抄自那里。。
hdu1166 (基本线段树(然后表示不明白为什么输出优化WA了
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; #define rep(i,n) for(int i=1;i<=n;i++) #define clr(x,c) memset(x,c,sizeof(x)) #define qwq(x) for(edge *o=head[x];o;o=o->next) #define lson l,m,x<<1 #define rson m+1,r,x<<1|1 int read(){ int x=0;char c=getchar();bool f=true; while(!isdigit(c)) { if(c==‘-‘) f=false;c=getchar(); } while(isdigit(c)) x=x*10+c-‘0‘,c=getchar(); return f?x:-x; } void print(int x){ char ch[10];int cur=0; if(x<0) putchar(‘-‘),x=-x; while(x) ch[++cur]=x%10+‘0‘,x/=10; for(int i=cur;i;i--) putchar(ch[i]); putchar(‘\n‘); return ; } const int nmax=50005; const int inf=0x7f7f7f7f; int sum[nmax<<2]; void pushup(int x){ sum[x]=sum[x<<1]+sum[x<<1|1];return ; } int query(int l,int r,int x,int tl,int tr){ if(tl<=l&&tr>=r) return sum[x]; int m=(l+r)>>1;int tmp=0; if(tl<=m) tmp+=query(lson,tl,tr); if(tr>m) tmp+=query(rson,tl,tr); return tmp; } void build(int l,int r,int x){ if(l==r) { sum[x]=read();return ; } int m=(l+r)>>1; build(lson);build(rson);pushup(x); } void update(int l,int r,int x,int p,int add){ if(l==r) { sum[x]+=add;return ; } int m=(l+r)>>1; p<=m?update(lson,p,add):update(rson,p,add); pushup(x); } int main(){ int t=read(); rep(i,t){ printf("Case %d:\n",i); int n=read(); build(1,n,1); char c[10]; while(scanf("%s",c)){ if(c[0]==‘E‘) break; int a=read(),b=read(); if(c[0]==‘Q‘) printf("%d\n",query(1,n,1,a,b));//print(query(1,n,1,a,b)); else if(c[0]==‘S‘) update(1,n,1,a,-b); else update(1,n,1,a,b); } } return 0; }
标签:
原文地址:http://www.cnblogs.com/fighting-to-the-end/p/5634252.html