제출 #1299919

#제출 시각아이디문제언어결과실행 시간메모리
1299919NewtonabcThe Xana coup (BOI21_xanadu)C++20
100 / 100
44 ms24064 KiB
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll MOD=1e9+7;
const int N=5e5+10;
ll dp[N][4],fda[N][2],fdb[N][2],st[N];
vector<int> adj[N];
void dfs(int u,int p){
    if(adj[u].size()==1){
        dp[u][0]=st[u]?1e9:0;
        dp[u][1]=st[u]?0:1e9;
        dp[u][2]=st[u]?1:1e9;
        dp[u][3]=st[u]?1e9:1;
        return;
    }
    int cnt=0;
    vector<int> c;
    c.push_back(0);
    for(auto v:adj[u]){
        if(v==p) continue;
        dfs(v,u);
        cnt++;
        c.push_back(v);
    }
    //calculate dp[u][i]
    fda[0][1]=1e9,fdb[0][1]=1e9;
    for(int i=1;i<=cnt;i++){
        fda[i][0]=min(fda[i-1][0]+dp[c[i]][0],fda[i-1][1]+dp[c[i]][2]);
        fda[i][1]=min(fda[i-1][0]+dp[c[i]][2],fda[i-1][1]+dp[c[i]][0]);
        fdb[i][0]=min(fdb[i-1][0]+dp[c[i]][1],fdb[i-1][1]+dp[c[i]][3]);
        fdb[i][1]=min(fdb[i-1][0]+dp[c[i]][3],fdb[i-1][1]+dp[c[i]][1]);
    }
    dp[u][0]=st[u]?fda[cnt][1]:fda[cnt][0];
    dp[u][1]=st[u]?fda[cnt][0]:fda[cnt][1];
    dp[u][2]=st[u]?fdb[cnt][0]+1LL:fdb[cnt][1]+1LL;
    dp[u][3]=st[u]?fdb[cnt][1]+1LL:fdb[cnt][0]+1LL;
}
int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int n;
    cin>>n;
    int rt=-1;
    for(int i=0;i<n-1;i++){
        int u,v;
        cin>>u >>v;
        adj[u].push_back(v);
        adj[v].push_back(u);
    }
    for(int i=1;i<=n;i++) cin>>st[i];
    for(int i=1;i<=n;i++){
        if(adj[i].size()>=2){
            rt=i;
            break;
        }
    }
    dfs(rt,rt);
    // cout<<rt <<"\n";
    // for(int i=1;i<=n;i++){
    //     cout<<i <<"\n";
    //     for(int j=0;j<4;j++) cout<<dp[i][j] <<" ";
    //     cout<<"\n";
    // }
    ll ans=min(dp[rt][0],dp[rt][2]);
    if(ans>=1e9) cout<<"impossible";
    else cout<<ans;
}
#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...