제출 #1149610

#제출 시각아이디문제언어결과실행 시간메모리
1149610LudisseyThe Xana coup (BOI21_xanadu)C++20
100 / 100
127 ms52036 KiB
#include <bits/stdc++.h> #define int long long #define sz(a) (int)a.size() #define all(a) a.begin(), a.end() using namespace std; int n; vector<int> on; vector<vector<int>> neigh; vector<vector<int>> child; vector<vector<vector<int>>> memo; void make_tree(int x, int p){ for (auto u : neigh[x]) { if(u==p) continue; make_tree(u,x); child[x].push_back(u); } } int dp(int x, bool sta, bool tog){ if(on[x]) sta=!sta; if(memo[x][sta][tog]!=-1) return memo[x][sta][tog]; vector<pair<int,int>> val(sz(child[x])); vector<int> df(sz(child[x])); int sm=0; for (int i = 0; i < sz(child[x]); i++) { int u=child[x][i]; val[i]={dp(u,tog,false), dp(u,tog,true)}; df[i]=val[i].second-val[i].first; sm+=val[i].first; } sort(all(df)); bool stat=sta^tog; if(stat){ if(sz(child[x])==0) return memo[x][sta][tog]=1e9; sm+=df[0]; } int mnSUM=sm; for (int i = stat; i < sz(child[x])-1; i+=2) { sm+=df[i]+df[i+1]; mnSUM=min(mnSUM,sm); } return memo[x][sta][tog]=mnSUM+tog; } signed main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cin >> n; neigh.resize(n); on.resize(n); child.resize(n); memo.resize(n,vector<vector<int>>(2,vector<int>(2,-1))); for (int i = 0; i < n-1; i++) { int a,b; cin >> a >> b; a--; b--; neigh[a].push_back(b); neigh[b].push_back(a); } for (int i = 0; i < n; i++) cin >> on[i]; make_tree(0, -1); int d=min(dp(0,0,1),dp(0,0,0)); if(d>=1e9) cout << "impossible\n"; else cout << d << "\n"; 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...