嗯……一个蒟蒻的树剖……

对于我这种只会写树剖的蒟蒻,交了无数发才可以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 条评论

  • @ 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钦点您常数辣鸡

    • @ 2016-11-06 19:34:49

      好像是这样……
      我总是觉得我写的数据结构常数都很大,也不知道为什么……

  • 1

信息

ID
1986
难度
6
分类
小h的妹子树 点击显示
标签
(无)
递交数
172
已通过
50
通过率
29%
被复制
2
上传者