제출 #373698

#제출 시각아이디문제언어결과실행 시간메모리
373698luciocfLove Polygon (BOI18_polygon)C++14
29 / 100
326 ms13800 KiB
#include <bits/stdc++.h>

using namespace std;

const int maxn = 1e5+10;

int f[maxn];

int comp[maxn], head[maxn], nivel[maxn], cc;
int ini[maxn], fim[maxn];
int mark[maxn];

bool done[maxn];

void dfs(int u)
{
	mark[u] = 1;

	if (mark[f[u]] == 1)
	{
		++cc;
		head[cc] = u, mark[u] = 2;
		ini[cc] = f[u], fim[cc] = u;
		return;
	}

	if (!mark[f[u]]) dfs(f[u]);

	nivel[u] = nivel[f[u]]+1, comp[u] = comp[f[u]];
	mark[u] = 2;
}

int main(void)
{
	int n;
	cin >> n;

	map<string, int> mp;

	int ind = 0;

	for (int i = 1; i <= n; i++)
	{
		string s1, s2;
		cin >> s1 >> s2;

		if (mp.find(s1) == mp.end()) mp[s1] = ++ind;
		if (mp.find(s2) == mp.end()) mp[s2] = ++ind;

		f[mp[s1]] = mp[s2];
	}

	if (n&1)
	{
		cout << "-1\n";
		return 0;
	}

	for (int i = 1; i <= n; i++)
		if (!mark[i])
			dfs(i);

	int ans = n;

	vector<int> v;
	for (int i = 1; i <= n; i++)
		if (nivel[i])
			v.push_back(i);

	sort(v.begin(), v.end(), [&] (int a, int b) {return nivel[a] > nivel[b];});

	for (int i = 1; i <= cc; i++)
	{
		for (int u = ini[cc]; u <= fim[cc]; u++)
		{
			if (done[u] || f[u] == u) continue;

			if (!done[f[u]])
			{
				ans -= (f[f[u]] == u ? 2 : 1);
				done[u] = done[f[u]] = 1;
			}
		}
	}

	for (auto u: v)
	{
		if (done[u]) continue;

		if (!done[f[u]])
		{
			ans--;
			done[u] = done[f[u]] = 1;
		}
	}

	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...