Submission #1295861

#TimeUsernameProblemLanguageResultExecution timeMemory
1295861Jawad_Akbar_JJThe Xana coup (BOI21_xanadu)C++20
100 / 100
57 ms15700 KiB
#include <iostream>
#include <vector>

using namespace std;
const int N = 1<<18;
vector<int> nei[N];
int dp[N][4], stt[N];

void dfs(int u, int p){
	dp[u][1] = dp[u][3] = N;
	for (int i : nei[u]){
		if (i == p)
			continue;
		dfs(i, u);
		int a[] = {dp[u][0], dp[u][1], dp[u][2], dp[u][3]};
		dp[u][0] = min(a[0] + dp[i][0], a[1] + dp[i][1]);
		dp[u][1] = min(a[1] + dp[i][0], a[0] + dp[i][1]);

		dp[u][2] = min(a[2] + dp[i][2], a[3] + dp[i][3]);
		dp[u][3] = min(a[3] + dp[i][2], a[2] + dp[i][3]);
	}

	int a[] = {dp[u][0], dp[u][1], dp[u][2], dp[u][3]};
	// cout<<u<<" ::\n";
	// cout<<a[0]<<" "<<a[1]<<" "<<a[2]<<" "<<a[3]<<endl;
	if (stt[u]){
		dp[u][0] = a[0|1];
		dp[u][1] = a[2|0] + 1;
		dp[u][2] = a[0|0];
		dp[u][3] = a[2|1] + 1;
	}
	else{
		dp[u][0] = a[0|0];
		dp[u][1] = a[2|1] + 1;
		dp[u][2] = a[0|1];
		dp[u][3] = a[2|0] + 1;
	}
	// cout<<dp[u][0]<<" "<<dp[u][1]<<" "<<dp[u][2]<<" "<<dp[u][3]<<endl;
}

int main(){
	ios_base::sync_with_stdio(false); cin.tie(NULL);
	int n;
	cin>>n;

	for (int i=1, a, b;i<n;i++){
		cin>>a>>b;
		nei[a].push_back(b);
		nei[b].push_back(a);
	}

	for (int i=1;i<=n;i++)
		cin>>stt[i];

	dfs(1, 1);
	int Ans = min(dp[1][0], dp[1][1]);
	if (Ans >= N)
		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...