Submission #908769

#TimeUsernameProblemLanguageResultExecution timeMemory
908769dsyzThe Xana coup (BOI21_xanadu)C++17
100 / 100
61 ms18544 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define MAXN (100005)
ll N;
vector<ll> v[MAXN];
ll dp[MAXN][2][2]; //index, press node x's button, final state of node x
bool initial[MAXN];
void dfs(ll x,ll p){
	if(initial[x]){
		dp[x][1][0] = 1;
		dp[x][0][1] = 0;
	}else{
		dp[x][1][1] = 1;
		dp[x][0][0] = 0;
	}
	for(auto u : v[x]){
		if(u != p){
			dfs(u,x);
			ll a = dp[x][0][0], b = dp[x][0][1], c = dp[x][1][0], d = dp[x][1][1];
			dp[x][0][0] = min(a + dp[u][0][0],b + dp[u][1][0]);
			dp[x][0][1] = min(b + dp[u][0][0],a + dp[u][1][0]);
			dp[x][1][0] = min(c + dp[u][0][1],d + dp[u][1][1]);
			dp[x][1][1] = min(d + dp[u][0][1],c + dp[u][1][1]);
		}
	}
}
int main() {
	ios_base::sync_with_stdio(false);cin.tie(0);
	cin>>N;
	for(ll i = 0;i < N - 1;i++){
		ll a,b;
		cin>>a>>b;
		a--, b--;
		v[a].push_back(b);
		v[b].push_back(a);
	}
	for(ll i = 0;i < N;i++){
		cin>>initial[i];
	}
	for(ll i = 0;i < N;i++){
		for(ll j = 0;j < 2;j++){
			for(ll k = 0;k < 2;k++){
				dp[i][j][k] = 1e9;
			}
		}
	}
	dfs(0,-1);
	ll minimum = 1e9;
	minimum = min({minimum,dp[0][0][0],dp[0][1][0]}); //note that node 0 is the root so its final state must be turned off
	if(minimum >= 1e9){
		cout<<"impossible"<<'\n';
	}else{
		cout<<minimum<<'\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...