Submission #1299919

#TimeUsernameProblemLanguageResultExecution timeMemory
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...