Submission #1323893

#TimeUsernameProblemLanguageResultExecution timeMemory
1323893i271828The Xana coup (BOI21_xanadu)C++20
100 / 100
86 ms23120 KiB
#include <bits/stdc++.h>
#define pii pair<int,int>
#define ll long long
using namespace std;

const int MAX=1e5+5;
const int INF=1<<30;

int N;
vector<int> adj[MAX];
bool A[MAX];
ll dp[MAX][2][2];

void dfs(int x,int p){
	for (auto y:adj[x]) if (y!=p) dfs(y,x);
	for (int a=0;a<2;a++) for (int b=0;b<2;b++){
		ll t=a;
		vector<ll> V;
		for (auto y:adj[x]){
			if (y==p) continue;
			t+=dp[y][0][a^A[y]];
			V.push_back(dp[y][1][a^A[y]]-dp[y][0][a^A[y]]);
		}
		sort(V.begin(),V.end());
		dp[x][a][b]=INF;
		int c=b^a;
		if (c==0) dp[x][a][b]=min(dp[x][a][b],t);
		for (auto v:V){
			c^=1;
			t+=v;
			if (c==0) dp[x][a][b]=min(dp[x][a][b],t);
		}
		dp[x][a][b]=min(dp[x][a][b],(ll)INF);
	}
}

int main(){
	cin>>N;
	for (int i=0;i<N-1;i++){
		int a,b;cin>>a>>b;a--,b--;
		adj[a].push_back(b),adj[b].push_back(a);
	}
	for (int i=0;i<N;i++) cin>>A[i];
	dfs(0,-1);
	ll ans=min(dp[0][0][A[0]],dp[0][1][A[0]]);
	if (ans>=INF) cout<<"impossible\n";
	else cout<<ans<<'\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...