Submission #1361696

#TimeUsernameProblemLanguageResultExecution timeMemory
1361696NonozeLove Polygon (BOI18_polygon)C++20
100 / 100
225 ms25888 KiB
#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define cmax(a,b) a=max(a,b)
#define cmin(a,b) a=min(a,b)
#define all(x) (x).begin(),(x).end()
#define rall(x) (x).rbegin(),(x).rend()
#define sz(x) (int)x.size()
// #define int long long

int solve();

signed main() {
	ios::sync_with_stdio(0); cin.tie(0);
	cout << solve() << endl;
	return 0;
}



int n;
vector<int> a;

int solve() {
	cin >> n;
	a.resize(n);
	map<string, int> mp; int cur=0;
	vector<set<int>> visited(n);
	vector<bool> connected(n, 1);
	vector<string> vec;
	int cnt=0;
	int ans=0;
	for (int i=0; i<n; i++) {
		string s, t; cin >> s >> t;
		if (!mp.count(s)) mp[s]=cur++, vec.pb(s);
		if (!mp.count(t)) mp[t]=cur++, vec.pb(t);
		a[mp[s]]=mp[t];
		visited[mp[t]].insert(mp[s]);
		if (mp[s]==mp[t]) connected[mp[s]]=0, cnt++;
	}
	for (int i=0; i<n; i++) if (a[i]!=i && a[a[i]]==i) {
		connected[i]=0;
		for (auto &x: visited[i]) if (x!=a[i]) cnt++, connected[x]=0;
	}
	if (n%2) return -1;
	set<pair<int, int>> st; for (int i=0; i<n; i++) if (connected[i]) st.insert({sz(visited[i]), i});
	while (!st.empty()) {
		int u=st.begin()->se; st.erase(st.begin());
		int v=a[u]; ans++;
		auto nxtv=a[v];
		if (connected[nxtv]) {
			st.erase({sz(visited[nxtv]), nxtv});
			visited[nxtv].erase(v);
			st.insert({sz(visited[nxtv]), nxtv});
		}
		if (connected[v]) st.erase({sz(visited[v]), v});
		else cnt--;
		// cout << vec[u] << ' ' << vec[v] << endl;
		connected[u]=connected[v]=0;
		for (auto &x: visited[v]) if (connected[x]) connected[x]=0, cnt++, st.erase({sz(visited[x]), x});
		for (auto &x: visited[u]) if (connected[x]) connected[x]=0, cnt++, st.erase({sz(visited[x]), x});
	}
	return cnt+ans;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...