求助/kel
查看原帖
求助/kel
160839
Prean楼主2020/10/1 21:28

LCT似乎都除了问题,我AFO罢/kk

第一次查询正确,第二次查询错误,然后死循环。。。

求dalao帮忙查一下这个LCT哪儿错了/kel

#include<cstdio>
#define DEBUG printf("Baylor AK IOI!!!/n"); 
const int M=1e5+5;
int n,m,a[M],f[M],siz[M],dp[M][2],chi[M][2];
inline int max(const int&a,const int&b){
    return a>b?a:b;
}
struct Edge{
    int to;Edge*nx;
}e[M<<1],*h[M],*cnt=e;
inline void Add(const int&u,const int&v){
    *cnt=(Edge){v,h[u]};h[u]=cnt++;
    *cnt=(Edge){u,h[v]};h[v]=cnt++;
}
struct Matrix{
    int a[2][2];
    inline Matrix(){
		a[0][0]=a[0][1]=a[1][0]=a[1][1]=0;
	}
    inline int*operator[](const int&n){
        return a[n];
    }
    friend inline Matrix operator*(Matrix a,Matrix b){
        Matrix c;
        int i,j,k;
        for(i=0;i<2;++i){
            for(j=0;j<2;++j){
                for(k=0;k<2;++k){
                    c[i][j]=max(c[i][j],a[i][k]+b[k][j]);
                }
            }
        }
        return c;
    }
}val[M],sum[M];
void Firsk_DFS(int u){
    dp[u][1]=a[u];
    for(Edge*E=h[u];E;E=E->nx){
        int v=E->to;
        if(v==f[u])continue;
        f[v]=u;Firsk_DFS(v);
        dp[u][0]+=max(dp[v][0],dp[v][1]);
        dp[u][1]+=dp[v][0];
    }
    val[u][0][0]=val[u][0][1]=dp[u][0];
    val[u][1][0]=dp[u][1];
    sum[u]=val[u];
}
inline void update(const int&u){
    sum[u]=val[u];
    if(chi[u][0])sum[u]=sum[chi[u][0]]*sum[u];
    if(chi[u][1])sum[u]=sum[u]*sum[chi[u][1]];
}
inline bool get(const int&u){
    return chi[f[u]][0]==u||chi[f[u]][1]==u;
}
inline bool son(const int&u){
    return chi[f[u]][1]==u;
}
inline void connect(int u,int fa,int s){
    chi[fa][s]=u;f[u]=fa;
}
inline void rotate(int u){
    int v=f[u],f1=get(u),f2=son(v);
    if(chi[v][f1]=chi[u][!f1])f[chi[u][!f1]]=v;
    if(get(v))chi[f[v]][f2]=u;f[u]=f[v];
    chi[f[v]=u][!f1]=v;
    update(v);
}
inline void Splay(int u){
    int v;
    while(get(u)){
        if(get(v=f[u]))rotate(son(u)^son(v)?u:v);
        rotate(u);
    }
}
inline void Access(int u){
    for(int v=0;u;u=f[v=u]){
        Splay(u);
        if(chi[u][1]){
            val[u][0][0]+=max(sum[chi[u][1]][0][0],sum[chi[u][1]][1][0]);
            val[u][1][0]+=sum[chi[u][1]][0][0];
        }
        if(v){
            val[u][0][0]-=max(sum[v][0][0],sum[v][1][0]);
            val[u][1][0]-=sum[v][0][0];
        }
        val[u][0][1]=val[u][0][0];
        chi[u][1]=v;
        update(u);
    }
}
inline void Modify(int u,int x){
    Access(u);Splay(u);
    val[u][1][0]-=a[u]-x;
    update(u);
    a[u]=x;
}
signed main(){
    int i,u,v;
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;++i)scanf("%d",a+i);
    for(i=1;i<n;++i){
        scanf("%d%d",&u,&v);
        Add(u,v);
    }
    Firsk_DFS(1);
    for(i=1;i<=m;++i){
        scanf("%d%d",&u,&v);
        Modify(u,v);Splay(1);
        printf("%d\n",max(sum[1][0][0],val[1][1][0]));
    }
}
2020/10/1 21:28
加载中...