제출 #1140447

#제출 시각아이디문제언어결과실행 시간메모리
1140447mnbvcxz123The Xana coup (BOI21_xanadu)C++20
100 / 100
108 ms29764 KiB
#include<bits/stdc++.h> using namespace std; using ll=long long; constexpr int N=1e5+5; constexpr int inf=1e9; int n; int dp[N][2][2]; int a[N]; vector<int>g[N]; void dfs(int v, int e){ for(const int&i:g[v]){ if(i==e)continue; dfs(i,v); } vector<int>all; ll tot=0; for(const int&i:g[v]){ if(i==e)continue; tot+=dp[i][a[i]][0]; all.push_back(dp[i][a[i]][1]-dp[i][a[i]][0]); } sort(all.begin(),all.end()); vector<ll>p(all.size()+1); for(int i=1;i<=all.size();++i) p[i]=p[i-1]+all[i-1]; vector<ll>mn(2,inf); for(int i=0;i<=all.size();++i) mn[i&1]=min(mn[i&1],tot+p[i]); dp[v][0][0]=mn[0]; dp[v][1][0]=mn[1]; all.clear(); tot=0; for(const int&i:g[v]){ if(i==e)continue; tot+=dp[i][a[i]^1][0]; all.push_back(dp[i][a[i]^1][1]-dp[i][a[i]^1][0]); } sort(all.begin(),all.end()); mn[0]=mn[1]=inf; for(int i=1;i<=all.size();++i) p[i]=p[i-1]+all[i-1]; for(int i=0;i<=all.size();++i) mn[i&1]=min(mn[i&1],tot+p[i]+1); dp[v][0][1]=mn[1]; dp[v][1][1]=mn[0]; } int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); cin>>n; for(int i=1,a,b;i<n;++i){ cin>>a>>b; g[a].push_back(b); g[b].push_back(a); } for(int i=1;i<=n;++i) cin>>a[i]; dfs(1,-1); int ret=min(dp[1][a[1]][0],dp[1][a[1]][1]); if(ret==inf) cout<<"impossible\n"; else cout<<ret<<'\n'; }
#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...