Submission #1366341

#TimeUsernameProblemLanguageResultExecution timeMemory
1366341ivazivaThe Xana coup (BOI21_xanadu)C++20
5 / 100
52 ms14372 KiB
#include <bits/stdc++.h>

using namespace std;

#define MAXN 100001
#define int long long

int n;
vector<int> adj[MAXN];
int state[MAXN];
int dp[2][2][MAXN];

void dfs(int node,int pret)
{
	if ((int)adj[node].size()==1 and node!=1)
	{
		if (state[node]==0)
		{
			dp[0][0][node]=0;dp[0][1][node]=INT_MAX;
			dp[1][0][node]=INT_MAX;dp[1][1][node]=1;
	    }
	    else
	    {
			dp[0][0][node]=INT_MAX;dp[0][1][node]=0;
			dp[1][0][node]=1;dp[1][1][node]=INT_MAX;
		}
		return;
    }
	for (int sled:adj[node])
	{
		if (sled!=pret) dfs(sled,node);
	}
	if (state[node]==0)
	{
		int children=0;
		int brupaljenih=0,minrazlika=INT_MAX;
		bool indicator=false;
		for (int sled:adj[node])
		{
			if (sled==pret) continue;
			if (min(dp[0][0][sled],dp[1][0][sled])==INT_MAX) {indicator=true;break;}
			children+=min(dp[0][0][sled],dp[1][0][sled]);
			if (dp[1][0][sled]<dp[0][0][sled]) brupaljenih++;
			else minrazlika=min(minrazlika,dp[1][0][sled]-dp[0][0][sled]);
		}
		if (indicator) {dp[0][0][node]=INT_MAX;dp[0][1][node]=INT_MAX;}
		else if (brupaljenih%2==0) {dp[0][0][node]=children;dp[0][1][node]=min(children+minrazlika,(long long)INT_MAX);}
		else {dp[0][0][node]=min(children+minrazlika,(long long)INT_MAX);dp[0][1][node]=children;}
		children=0;
		brupaljenih=0,minrazlika=INT_MAX;
		indicator=false;
		for (int sled:adj[node])
		{
			if (sled==pret) continue;
			if (min(dp[0][1][sled],dp[1][1][sled])==INT_MAX) {indicator=true;break;}
			children+=min(dp[0][1][sled],dp[1][1][sled]);
			if (dp[1][1][sled]<dp[0][1][sled]) brupaljenih++;
			else minrazlika=min(minrazlika,dp[1][1][sled]-dp[0][1][sled]);
		}
		if (indicator) {dp[1][0][node]=INT_MAX;dp[1][1][node]=INT_MAX;}
		else if (brupaljenih%2==0) {dp[1][0][node]=min(1+children+minrazlika,(long long)INT_MAX);dp[1][1][node]=1+children;}
		else {dp[1][0][node]=1+children;dp[1][1][node]=min(1+children+minrazlika,(long long)INT_MAX);}
    }
    else
    {
		int children=0;
		int brupaljenih=0,minrazlika=INT_MAX;
		bool indicator=false;
		for (int sled:adj[node])
		{
			if (sled==pret) continue;
			if (min(dp[0][0][sled],dp[1][0][sled])==INT_MAX) {indicator=true;break;}
			children+=min(dp[0][0][sled],dp[1][0][sled]);
			if (dp[1][0][sled]<dp[0][0][sled]) brupaljenih++;
			else minrazlika=min(minrazlika,dp[1][0][sled]-dp[0][0][sled]);
		}
		if (indicator) {dp[0][0][node]=INT_MAX;dp[0][1][node]=INT_MAX;}
		else if (brupaljenih%2==0) {dp[0][0][node]=min(children+minrazlika,(long long)INT_MAX);dp[0][1][node]=children;}
		else {dp[0][0][node]=children;dp[0][1][node]=min(children+minrazlika,(long long)INT_MAX);}
		children=0;
		brupaljenih=0,minrazlika=INT_MAX;
		indicator=false;
		for (int sled:adj[node])
		{
			if (sled==pret) continue;
			if (min(dp[0][1][sled],dp[1][1][sled])==INT_MAX) {indicator=true;break;}
			children+=min(dp[0][1][sled],dp[1][1][sled]);
			if (dp[1][1][sled]<dp[0][1][sled]) brupaljenih++;
			else minrazlika=min(minrazlika,dp[1][1][sled]-dp[0][1][sled]);
		}
		if (indicator) {dp[1][0][node]=INT_MAX;dp[1][1][node]=INT_MAX;}
		else if (brupaljenih%2==0) {dp[1][0][node]=1+children;dp[1][1][node]=min(1+children+minrazlika,(long long)INT_MAX);}
		else {dp[1][0][node]=min(1+children+minrazlika,(long long)INT_MAX);dp[1][1][node]=1+children;}
    }
}

int32_t main()
{
	cin>>n;for (int i=1;i<n;i++) {int u,v;cin>>u>>v;adj[u].push_back(v);adj[v].push_back(u);}
	for (int node=1;node<=n;node++) cin>>state[node];
	dfs(1,0);
	/*for (int node=1;node<=n;node++)
	{
		if (dp[0][0][node]==INT_MAX) cout<<"inf ";
		else cout<<dp[0][0][node]<<" ";
		if (dp[0][1][node]==INT_MAX) cout<<"inf ";
		else cout<<dp[0][1][node]<<" ";
		if (dp[1][0][node]==INT_MAX) cout<<"inf ";
		else cout<<dp[1][0][node]<<" ";
		if (dp[1][1][node]==INT_MAX) cout<<"inf ";
		else cout<<dp[1][1][node]<<" ";
		cout<<endl;
	}*/
	int answer=min(dp[0][0][1],dp[1][0][1]);
	if (answer==INT_MAX) cout<<"impossible"<<endl;
	else cout<<answer<<endl;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...