- 小h的妹子树二
- 2016-09-28 15:25:52 @
对于我这种只会写树剖的蒟蒻,交了无数发才可以AC……
各种错误让我怀疑我到底会不会写树剖……
树剖本来还是过不了的,加点奇巧淫技强行水过……
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
#define maxn 100010
using namespace std;
typedef long long llg;
int head[maxn],ne[maxn<<1],to[maxn<<1],tt,a[maxn],n,m,c[maxn];
int siz[maxn],fa[maxn],son[maxn],top[maxn],fc[maxn],dep[maxn];
int getint(){
int w=0;bool q=0;
char c=getchar();
while((c>'9'||c<'0')&&c!='-') c=getchar();
if(c=='-') c=getchar(),q=1;
while(c>='0'&&c<='9') w=w*10+c-'0',c=getchar();
return q?-w:w;
}
void link(int x,int y){
to[++tt]=y;ne[tt]=head[x];head[x]=tt;
to[++tt]=x;ne[tt]=head[y];head[y]=tt;
}
void dfs(int u){
siz[u]=1; dep[u]=dep[fa[u]]+1;
for(int i=head[u],v;v=to[i],i;i=ne[i])
if(!siz[v]){
fa[v]=u; siz[v]=1; dfs(v); siz[u]+=siz[v];
if(siz[v]>siz[son[u]]) son[u]=v;
}
}
void dfs(int u,int tp){
fc[u]=++tt; top[u]=tp;
if(son[u]) dfs(son[u],tp);
for(int i=head[u],v;v=to[i],i;i=ne[i])
if(!fc[v]) dfs(v,v);
}
void add(int x,int y){while(x<=n) c[x]+=y,x+=x&(-x);}
int sum(int x){
int t=0;
while(x) t+=c[x],x-=x&(-x);
return t;
}
void solve(int u,int v){
int _sum=0;
while(top[u]!=top[v]){
if(dep[fa[top[u]]]<dep[fa[top[v]]]) swap(u,v);
_sum-=sum(fc[top[u]]-1); _sum+=sum(fc[u]);
u=fa[top[u]];
}
if(dep[u]<dep[v]) swap(u,v);
_sum+=sum(fc[u]); _sum-=sum(fc[v]-1);
printf("%d\n",_sum);
}
int main(){
File("a");
n=getint();
for(int i=1;i<=n;i++) a[i]=getint();
for(int i=1;i<n;i++) link(getint(),getint());
tt=0; dfs(1); dfs(1,1); m=getint();
for(int i=1;i<=n;i++) add(fc[i],a[i]);
while(m--){
char c=getchar();
while(c!='Q' && c!='C') c=getchar();
int u=getint(),v=getint();
if(c=='C') add(fc[u],-a[u]),add(fc[u],a[u]=v);
else solve(u,v);
}
}
5 条评论
-
qq872191552 LV 9 @ 2016-11-12 08:15:46
LCF的妹子实在是太多辣!多的他又种下了一颗妹子树。
-
2016-11-06 22:11:05@
会写树剖的蒟蒻。。
-
2016-11-06 21:48:13@
路过蒟蒻%%%
-
2016-11-03 19:11:11@
小胖子太神辣!!!%%%%%%%%
-
2016-11-03 19:04:28@
某(可能参与)神犇sqc钦点您常数辣鸡
- 1