제출 #1123126

#제출 시각아이디문제언어결과실행 시간메모리
1123126NDT134The Xana coup (BOI21_xanadu)C++20
0 / 100
76 ms7748 KiB
#include<iostream>
#include<vector>
#include<queue>

using namespace std;
using pi = pair<int, int>;
using pii = pair<pi, pi>;

int main() {
	int n; cin >> n;
	vector<vector<int>> g(n);
	for (int i = 0; i < n - 1; i++)
	{
		int a, b; cin >> a >> b; a--; b--;
		g[b].push_back(a); g[a].push_back(b);
	}
	vector<int> v(n);
	for (int i = 0; i < n; i++)
	{
		cin >> v[i];
	}

	vector<int> p(n), ch(n);
	queue<int> q; q.push(0);
	while (!q.empty())
	{
		int x = q.front(); q.pop();
		for (int y : g[x])
		{
			if (p[x] != y)
			{
				p[y] = x;
				q.push(y);
				ch[x]++;
			}
		}
	}

	for (int i = 0; i < n; i++)
	{
		if (!ch[i])
		{
			q.push(i);
		}
	}

	int r1 = 0;
	vector<int> a(n), vv = v;
	for (int j = n - 1; j >= 2; j--)
	{
		if (v[j] != a[j])
		{
			v[j] = !v[j];
			v[j - 1] = !v[j - 1];
			v[j - 2] = !v[j - 2];
			r1++;
		}
	}
	if (v[1] != a[1])
	{
		v[1] = !v[1];
		v[0] = !v[0];
		r1++;
	}
	if (v[0] != a[0])
	{
		r1 = n + 1;
	}

	v = vv;
	int r2 = 1;
	a[n - 1] = 1; a[n - 2] = 1;
	for (int j = n - 1; j >= 2; j--)
	{
		if (v[j] != a[j])
		{
			v[j] = !v[j];
			v[j - 1] = !v[j - 1];
			v[j - 2] = !v[j - 2];
			r2++;
		}
	}
	if (v[1] != a[1])
	{
		v[1] = !v[1];
		v[0] = !v[0];
		r2++;
	}
	if (v[0] != a[0])
	{
		r2 = n + 1;
	}
	
	int r = min(r1, r2);
	if (r == n + 1)
	{
		cout << "IMPOSSIBLE" << endl;
		return 0;
	}

	cout << r << endl;
}
#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...