Submission #1236189

#TimeUsernameProblemLanguageResultExecution timeMemory
1236189ereringThe Xana coup (BOI21_xanadu)C++20
100 / 100
47 ms34632 KiB
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define endl '\n'
#define int long long
const int N=1e5+5,inf=2e12,MOD=1e9+7;
int dp[N][2][2]; //start and press?
vector<int> adj[N];
int t[N];
void solve(int node,int type,vector<int> vec,int ans){
    sort(vec.begin(),vec.end(),greater<int>());
    int ans2=ans;
    if(type==1)ans2+=vec.back();
    dp[node][0][type]=ans2;
    for(int i=vec.size()-2-type;i>=0;i-=2){
        ans2+=vec[i]; ans2+=vec[i+1];
        dp[node][0][type]=min(dp[node][0][type],ans2);
    }
    ans2=ans;
    if(type==0)ans2+=vec.back();
    dp[node][1][type]=ans2;
    for(int i=vec.size()-3+type;i>=0;i-=2){
        ans2+=vec[i]; ans2+=vec[i+1];
        dp[node][1][type]=min(dp[node][1][type],ans2);
    }
    if(type==1){
        dp[node][0][type]++;
        dp[node][1][type]++;
    }
}
void dfs(int node,int par){
    int ans=0,ans2=0;
    vector<int> vec,vec2;
    for(auto i:adj[node]){
        if(i==par)continue;
        dfs(i,node);
        ans+=dp[i][t[i]][0];
        ans2+=dp[i][t[i]^1][0];
        vec.pb(dp[i][t[i]][1]-dp[i][t[i]][0]);
        vec2.pb(dp[i][t[i]^1][1]-dp[i][t[i]^1][0]);
      //  if(node==1)cout<<dp
    }
    if(vec.empty()){
        dp[node][0][0]=0;
        dp[node][1][1]=1;
       // cout<<node<<' '<<dp[node][t[node]][0]<<' '<<dp[node][t[node]][1]<<endl;
        return;
    }
    solve(node,0,vec,ans);
    solve(node,1,vec2,ans2);
   // cout<<node<<' '<<dp[node][t[node]][0]<<' '<<dp[node][t[node]][1]<<' '<<ans<<endl;
}
signed main(){
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int n; cin>>n;
    for(int i=0;i<n-1;i++){
        int x,y; cin>>x>>y;
        adj[x].pb(y);
        adj[y].pb(x);
    }
    for(int i=1;i<=n;i++){
        cin>>t[i];
        for(int j=0;j<2;j++){
            for(int k=0;k<2;k++)dp[i][j][k]=inf;
        }
    }
    dfs(1,0);
    int sol=min(dp[1][t[1]][0],dp[1][t[1]][1]);
   // cout<<dp[2][0][0]<<' '<<dp[3][1][1]<<endl;
    if(sol>n)cout<<"impossible";
    else cout<<sol;
}
#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...