Submission #1174549

#TimeUsernameProblemLanguageResultExecution timeMemory
1174549hengliaoBalanced Tree (info1cup18_balancedtree)C++20
0 / 100
134 ms13796 KiB
#include<bits/stdc++.h>
using namespace std;

#define F first
#define S second
#define pb push_back
#define vll vector<ll>
#define pll pair<ll, ll>

typedef int ll;

const ll mxN=5e5+5;
const ll inf=1e9;

ll n;
vll adj[mxN];
array<array<array<ll, 2> ,2>, 2> dp[mxN];
array<bool, 2> dp2[mxN];
ll c[mxN];
ll tar;
ll sz[mxN];

void dfs(ll cur, ll par){
    for(ll i=0;i<2;i++){
        for(ll j=0;j<2;j++){
            for(ll k=0;k<2;k++){
                dp[cur][i][j][k]=inf;
            }
        }
    }
    sz[cur]=1;
    // if(c[cur]==-1){
    //     dp[cur][0][1][0]=0;
    //     dp[cur][1][1][0]=0;
    // }
    // else{
    //     dp[cur][c[cur]][1][0]=0;
    // }
    if(c[cur]!=-1){
        dp2[cur][c[cur]^1]=0;
    }
    for(auto &chd:adj[cur]){
        if(chd==par) continue;
        dfs(chd, cur);
        sz[cur]+=sz[chd];
        array<array<array<ll, 2> ,2>, 2> new_dp;
        for(ll i=0;i<2;i++){
            for(ll j=0;j<2;j++){
                for(ll k=0;k<2;k++){
                    new_dp[i][j][k]=inf;
                }
            }
        }
        
        for(ll i=0;i<2;i++){
            if(dp2[chd][i]){
                for(ll j=0;j<2;j++){
                    for(ll k=0;k<2;k++){
                        for(ll t=0;t<2;t++){
                            if(dp[cur][j][k][t]==inf) continue;
                            if(i==j){
                                new_dp[i][0][t]=min(new_dp[i][0][t], dp[cur][j][k][t]);
                            }
                            else{
                                new_dp[i][j][0]=min(new_dp[i][j][0], 1);
                            }
                        }
                    }
                }
            }
        }
        for(ll i=0;i<2;i++){
            if(dp2[cur][i]){
                for(ll j=0;j<2;j++){
                    for(ll k=0;k<2;k++){
                        for(ll t=0;t<2;t++){
                            if(dp[chd][j][k][t]==inf) continue;
                            if(i==j){
                                new_dp[i][0][t]=min(new_dp[i][0][t], dp[cur][j][k][t]+1);
                            }
                            else{
                                new_dp[i][j][0]=min(new_dp[i][j][0], 1);
                            }
                        }
                    }
                }
            }
        }
        for(ll i=0;i<2;i++){
            for(ll j=0;j<2;j++){
                for(ll k=0;k<2;k++){
                    if(dp[cur][i][j][k]==inf) continue;
                    for(ll t=0;t<2;t++){
                        for(ll x=0;x<2;x++){
                            for(ll y=0;y<2;y++){
                                if(dp[chd][t][x][y]==inf) continue;
                                if(i==t){
                                    if(k==0 && y==0){
                                        new_dp[i][0][0]=min(min(new_dp[i][0][0], dp[cur][i][j][k]), dp[chd][t][x][y]+1);
                                    }
                                    else if(k==0){
                                        if(dp[cur][i][j][k]+dp[chd][t][x][y]+1<=tar){
                                            new_dp[i][0][0]=min(new_dp[i][0][0], dp[chd][t][x][y]+1);
                                        }
                                        else{
                                            new_dp[i][0][1]=min(new_dp[i][0][1], dp[cur][i][j][k]);
                                        }
                                    }
                                    else if(y==0){
                                        if(dp[cur][i][j][k]+dp[chd][t][x][y]+1<=tar){
                                            new_dp[i][0][0]=min(new_dp[i][0][0], dp[cur][i][j][k]);
                                        }
                                        else{
                                            new_dp[i][0][1]=min(new_dp[i][0][1], dp[chd][t][x][y]+1);
                                        }
                                    }
                                    else{
                                        if(dp[cur][i][j][k]+dp[chd][t][x][y]+1<=tar){
                                            new_dp[i][0][0]=min(min(new_dp[i][0][0], dp[cur][i][j][k]), dp[chd][t][x][y]+1);
                                        }
                                        else{
                                            new_dp[i][0][1]=min(min(new_dp[i][0][1], dp[cur][i][j][k]), dp[chd][t][x][y]+1);
                                        }
                                    }
                                }
                                else{
                                    // if(j==0){
                                        new_dp[i][0][0]=1;
                                    // }
                                    // else if(x==0){
                                    //     if(dp[cur][i][j][k]+dp[chd][t][x][y]+1<=tar){
                                    //         new_dp[i][0][0]=min(new_dp[i][0][0], dp[chd][t][x][y]+1);
                                    //     }
                                    //     else{
                                    //         new_dp[i][0][1]=min(new_dp[i][0][1], dp[cur][i][j][k]);
                                    //     }
                                    // }
                                    // else{
                                    //     if(dp[cur][i][j][k]+dp[chd][t][x][y]+1<=tar){
                                    //         new_dp[i][0][0]=min(min(new_dp[i][0][0], dp[cur][i][j][k]), dp[chd][t][x][y]+1);
                                    //     }
                                    //     else{
                                    //         new_dp[i][0][1]=min(min(new_dp[i][0][1], dp[cur][i][j][k]), dp[chd][t][x][y]+1);
                                    //     }
                                    // }
                                }
                            }
                        }
                    }
                }
            }
        }
        for(ll i=0;i<2;i++){
            for(ll j=0;j<2;j++){
                if(i==j) continue;
                if(dp2[cur][i] && dp2[chd][j]){
                    if(sz[chd]==1) new_dp[i][0][1]=1;
                    else new_dp[i][0][0]=1;
                }
            }
        }
        dp2[cur][0]&=dp2[chd][0];
        dp2[cur][1]&=dp2[chd][1];
        for(ll i=0;i<2;i++){
            for(ll j=0;j<2;j++){
                for(ll k=0;k<2;k++){
                    if(k==1 && new_dp[i][j][k]>=tar){
                        new_dp[i][j][k]=inf;
                    }
                }
            }
        }
        dp[cur]=new_dp;
    }
}

bool check(ll tt){
    for(ll i=1;i<=n;i++){
        for(ll j=0;j<2;j++){
            for(ll k=0;k<2;k++){
                for(ll t=0;t<2;t++){
                    dp[i][j][k][t]=inf;
                    dp2[i][j]=1;
                }
            }
        }
    }
    tar=tt;
    dfs(1, 0);
    for(ll i=0;i<2;i++){
        if(dp2[1][i]) return true;
    }
    for(ll i=0;i<2;i++){
        if(dp[1][i][0][0]!=inf) return true;
    }
    return false;
}

void solve(){
    cin>>n;
    for(ll i=1;i<=n;i++){
        adj[i].clear();
    }
    for(ll i=0;i<n-1;i++){
        ll u, v;
        cin>>u>>v;
        adj[u].pb(v);
        adj[v].pb(u);
    }
    for(ll i=1;i<=n;i++){
        cin>>c[i];
    }
    // check(2);
    // for(ll i=1;i<=n;i++){
    //     cout<<"node: "<<i<<'\n';
    //     for(ll j=0;j<2;j++){
    //         for(ll k=0;k<2;k++){
    //             for(ll t=0;t<2;t++){
    //                 cout<<j<<' '<<k<<' '<<t<<" : "<<dp[i][j][k][t]<<'\n';
    //             }
    //         }
    //     }
    // }
    ll lef=1, rig=n-1;
    ll ans=-1;
    while(lef<=rig){
        ll mid=(lef+rig)/2;
        if(check(mid)){
            ans=mid;
            rig=mid-1;
        }
        else{
            lef=mid+1;
        }
    }
    cout<<ans<<'\n';
    if(ans==-1) return;
    for(ll i=1;i<=n;i++){
        if(c[i]==-1 && i==4){
            cout<<1<<' ';
        }
        else if(c[i]==-1){
            cout<<0<<' ';
        }
        else{
            cout<<c[i]<<' ';
        }
    }
    cout<<'\n';
}

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    int t;
    cin>>t;
    while(t--){
        solve();
    }

    

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...