bzoj 1036: [ZJOI2008]树的统计Count

http://www.lydsy.com/JudgeOnline/problem.php?id=1036

 

大约是个树剖裸题,然后用lct水了一下

wa数发后突然意识到有负数,改了一下数组初始值,还是wa,woc!读入优化没判负数╮(╯_╰)╭囧

/**************************************************************
    Problem: 1036
    User: 11101001
    Language: C++
    Result: Accepted
    Time:4492 ms
    Memory:3516 kb
****************************************************************/
 
#include<cstdio>
#include<cstring>
#include<algorithm>
const int maxn =60007;
int n,m;
int top=0;
int ch[maxn][2],fa[maxn],stack[maxn];
int ans[maxn],maxx[maxn],v[maxn];
bool rev[maxn];
inline int read() {
    int x=0,f=1;
    char c=getchar();
    while(c<'0'||c>'9'){if(c=='-')f=-1; c=getchar();}
    while(c<='9'&&c>='0') x=x*10+c-'0',c=getchar();
    return x*f;
}
void update(int x) {
    ans[x]=ans[ch[x][1]]+ans[ch[x][0]]+v[x];    
    maxx[x]=std::max(maxx[ch[x][1]],std::max(maxx[ch[x][0]],v[x]));
}
bool isroot(int x) {
    return ch[fa[x]][1]!=x&&ch[fa[x]][0]!=x;
}
void pushdown(int x) {
    if(rev[x]) {
        rev[x]^=1;
        rev[ch[x][0]]^=1;rev[ch[x][1]]^=1;std::swap(ch[x][1],ch[x][0]);
    }
}
void rotate(int x) {
    int y=fa[x],z=fa[y],d=(ch[y][1]==x)^1;
    if(!isroot(y)) ch[z][ch[z][1]==y]=x;
    fa[x]=z;
    ch[y][d^1]=ch[x][d],fa[ch[x][d]]=y;
    ch[x][d]=y;fa[y]=x;
    update(y);update(x);
}
void splay(int x) {
    stack[++top]=x;
    for(int i=x;!isroot(i);i=fa[i]) stack[++top]=fa[i];
    while(top)pushdown(stack[top--]);
    while(!isroot(x)) {
        int y=fa[x],z=fa[y];
        if(!isroot(y)) {
            if(ch[y][1]==x^ch[z][1]==y)rotate(x);
            else rotate(y);
        }
        rotate(x);
    }
    return ;
}
void access(int x) {
    for(int i=0;x;i=x,x=fa[x]) { 
        splay(x);
        ch[x][1]=i;update(x);
    }
}
void makeroot(int x) {
    access(x),splay(x);rev[x]^=1;
}
void split(int x,int y) {
    makeroot(x),access(y);
    return splay(y);
}
int query(int x,int y,int op) {
    split(x,y);
    if(op)return ans[y];
    return maxx[y];
}
void modify(int x,int y) {
    access(x),splay(x),v[x]=y;
    return update(x);
}
struct wrj{
    int num,head[maxn];
    wrj() {
        num=0;memset(head,0,sizeof head);
    }
    struct node{
        int v,next;
    }edge[maxn];
    void add_edge(int x,int y) {
        edge[++num].v=y;edge[num].next=head[x];head[x]=num;
    }
    void dfs(int x) {
        for(int i=head[x];i;i=edge[i].next) {
            int vv=edge[i].v;
            if(vv!=fa[x]) {
                fa[vv]=x;
                dfs(vv);
            }
        }
    }
}gg;
int main() {
    n=read();
    std::memset(maxx,-0x3f,sizeof(maxx));
    for(int a,b,i=1;i<n;++i) {
        a=read(),b=read();gg.add_edge(a,b);gg.add_edge(b,a);
    }
    for(int i=1;i<=n;++i) {
        v[i]=read();
    }
    gg.dfs(1);
    m=read();
    char c[70];
    for(int a,b;m;m--) {
        scanf("%s",c),a=read(),b=read();
        if(c[1]=='S') {
            printf("%d\n",query(a,b,1));    
        }
        else if(c[1]=='M'){
            printf("%d\n",query(a,b,0));    
        }
        else modify(a,b);
    }
    return 0;
}

 

posted @ 2017-12-30 19:52  zzzzx  阅读(183)  评论(0编辑  收藏  举报