hdu3966[维护点权] 发表于 2018-04-13 | 分类于 算法 , 树 , 树链剖分 | 阅读数 次 链接:hdu3966[维护点权] 题解 注意仔细读题,维护点权模板题 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<algorithm>#define rep(i,x,y) for(register int i=x;i<=y;++i)#define repd(i,x,y) for(register int i=x;i>=y;--i)#define ll long long #define lson o<<1,l,mid#define rson o<<1|1,mid+1,rusing namespace std;const int N=1e5;int rt[N<<2],lz[N<<2],id[N],top[N],deep[N],size[N],f[N],hson[N];int nxt[N],w[N],wt[N],head[N],to[N];int n,m,q,a,b,c,cnt;char op[2];inline void adde(int u,int v){nxt[++cnt]=head[u];to[cnt]=v;head[u]=cnt;}inline void pushup(int o){rt[o]=rt[o<<1]+rt[o<<1|1];}inline void pushdown(int o,int len){ if(!lz[o])return ; lz[o<<1]+=lz[o]; lz[o<<1|1]+=lz[o]; rt[o<<1]+=lz[o]*(len-(len>>1)); rt[o<<1|1]+=lz[o]*(len>>1); lz[o]=0;}inline void build(int o,int l,int r){ lz[o]=0; if(l==r){rt[o]=w[l]; return ;} int mid=l+r>>1; build(lson); build(rson); pushup(o);}inline void update(int o,int l,int r,int L,int R,int x){ if(L<=l&&R>=r){rt[o]+=x*(r-l+1); lz[o]+=x;return ;} int mid=l+r>>1; pushdown(o,r-l+1); if(L<=mid)update(lson,L,R,x); if(R>mid)update(rson,L,R,x); pushup(o);}inline int query(int o,int l,int r,int x){ if(l==r)return rt[o]; pushdown(o,r-l+1); int mid=l+r>>1; if(x<=mid)return query(lson,x); return query(rson,x);}inline void dfs1(int x){ size[x]=1; for(int i=head[x];i;i=nxt[i])if(to[i]!=f[x]){ f[to[i]]=x; deep[to[i]]=deep[x]+1; dfs1(to[i]); size[x]+=size[to[i]]; if(size[hson[x]]<size[to[i]])hson[x]=to[i]; }}inline void dfs2(int x,int t){ top[x]=t;id[x]=++cnt;w[cnt]=wt[x]; if(hson[x])dfs2(hson[x],t); for(int i=head[x];i;i=nxt[i])if(hson[x]!=to[i]&&to[i]!=f[x])dfs2(to[i],to[i]);}inline void uprange(int x,int y,int k){ while(top[x]!=top[y]){ if(deep[top[x]]<deep[top[y]])swap(x,y); update(1,1,n,id[top[x]],id[x],k); x=f[top[x]]; } if(deep[x]>deep[y])swap(x,y); update(1,1,n,id[x],id[y],k);}int main(){ while(~scanf("%d%d%d",&n,&m,&q)){ //memset(f,-1,sizeof(f)); memset(head,0,sizeof(head)); memset(hson,0,sizeof(hson)); cnt=deep[1]=0; rep(i,1,n)scanf("%d",&wt[i]); rep(i,2,n){ scanf("%d%d",&a,&b); adde(a,b);adde(b,a); }cnt=0; dfs1(1); dfs2(1,1); build(1,1,n); while(q--){ scanf("%s",op); if(op[0]=='Q'){scanf("%d",&a);printf("%d\n",query(1,1,n,id[a]));} else { scanf("%d%d%d",&a,&b,&c); if(op[0]=='D')c*=-1; uprange(a,b,c); } } } return 0;}