【求助】萌新刚学oi,WA*5 TLE*1 MLE*1 RE*3

P4114 Qtree1

TLE自动机 @ 2019-02-12 20:05:38

调了两个小时实在是调不动了,有大佬愿意帮一下吗Orz

#include<iostream>
#include<cstdio>
using namespace std;
const long long maxn=1e5+5;
long long read(){
    long long x=0;char ch=getchar();bool pos=1;
    for(;!isdigit(ch);ch=getchar()) if(ch=='-') pos=0;
    for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';
    return pos?x:-x;
}
struct node{
    long long v,next,u;
}edge[maxn];
long long head[maxn],tope,d[maxn],fa[maxn],dep[maxn],son[maxn],top[maxn],lnk[maxn],res[maxn],sz[maxn],cnt,wn[maxn],ans[maxn<<2];
void add(long long from,long long to){
    edge[++tope].v=to;
    edge[tope].next=head[from];
    edge[tope].u=from;
    head[from]=tope;
}
long long mmax(long long a,long long b){return a>b?a:b;}
void Mswap(long long &a,long long &b){a^=b,b^=a,a^=b;}
void dfs1(long long now,long long pre,long long de){
    fa[now]=pre;
    dep[now]=de;
    long long maxn=-19260817;
    for(long long i=head[now];i;i=edge[i].next){
        long long v=edge[i].v;
        if(v==pre) break;
        dfs1(v,now,de+1);
        sz[now]+=(sz[v]+1);
        if(sz[v]>maxn){
            maxn=sz[v];
            son[now]=v;
        }
    }
}
void dfs2(long long now,long long tp){
    lnk[now]=++cnt;
    top[now]=tp;
    if(!son[now]) return;
    dfs2(son[now],tp);
    for(long long i=head[now];i;i=edge[i].next){
        long long v=edge[i].v;
        if(v==fa[now]||v==son[now]) continue;
        dfs2(v,v);
    }
}
inline void push_up(long long now){
    ans[now]=max(ans[now<<1],ans[now<<1|1]);
}
inline void work(long long l,long long r,long long now,long long end,long long k){
    if(l==r){
        ans[now]=k;
        return;
    }
    ans[now]=mmax(ans[now],k);
    long long mid=(l+r)/2;
    if(end<=mid) work(l,mid,now<<1,end,k);
    else work(mid+1,r,now<<1|1,end,k);
    return;
}
inline void build(long long l,long long r,long long now){
    if(l==r){
        ans[now]=res[l];
        return;
    }
    long long mid=(l+r)>>1;
    build(l,mid,now<<1);
    build(mid+1,r,now<<1|1);
    push_up(now);
}
inline long long query(long long nl,long long nr,long long l,long long r,long long now){
    long long re=-19260817;
    if(nl>=l&&nr<=r) return ans[now];
    long long mid=(nl+nr)>>1;
    if(l<=mid) re=mmax(re,query(nl,mid,l,r,now<<1));
    if(r>mid) re=mmax(re,query(mid+1,nr,l,r,now<<1|1));
    return re;
}
inline long long ask(long long s1,long long s2){
    long long re=-19260817;
    while(top[s1]!=top[s2]){
        if(dep[top[s1]]<dep[top[s2]]) Mswap(s1,s2);
        re=mmax(re,query(1,cnt,lnk[top[s1]],lnk[s1],1));
        s1=fa[top[s1]];
    }
    if(dep[s1]<dep[s2]) Mswap(s1,s2);
    long long ed;
    for(ed=s1;fa[ed]!=s2;ed=fa[ed]);//找到lca在当前重链上的儿子QwQ
    re=mmax(re,query(1,cnt,lnk[ed],lnk[s1],1));
    return re;
}
int main(){
    long long n=read();
    long long s; 
    for(long long i=2;i<=n;i++){
        long long u,v,w;
        u=read();v=read();w=read();
        d[i-1]=w;
        add(u,v);
        add(v,u);
    }string a;
    dfs1(1,1,1);
    dfs2(1,1);
    for(long long i=1;i<=n-1;i++){
        long long u=edge[i<<1].u;
        long long v=edge[i<<1].v;
        if(fa[u]=v) res[u]=d[i];
        else res[v]=d[i];
    }
    build(1,n,1);
    while(cin>>a){
        if(a=="DONE") break;
        long long x,y;
        x=read();y=read();
        if(a=="CHANGE"){
            long long u=edge[x<<1].u;
            long long v=edge[x<<1].v;
            if(fa[u]=v) work(1,cnt,1,lnk[u],y);
            else work(1,cnt,1,lnk[v],y);
        }else{
            printf("%lld\n",ask(x,y));
        }
    } 
    return 0;
} 

|