Submission #1259828

#TimeUsernameProblemLanguageResultExecution timeMemory
1259828M_W_13Love Polygon (BOI18_polygon)C++20
100 / 100
192 ms23520 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; #define rep(i, n) for (int i = 0; i < (n); i++) #define st first #define nd second #define pb push_back map<string, int> m; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n; cin >> n; if (n % 2 == 1) { cout << -1 << '\n'; return 0; } vector<pair<string, string>> vec; set<string> S; rep(i, n) { string a, b; cin >> a >> b; vec.pb({a, b}); S.insert(a); S.insert(b); } int kt = 1; for (auto s: S) { m[s] = kt; kt++; } int dokad[n + 1]; dokad[0] = 0; rep(i, n) { dokad[m[vec[i].st]] = m[vec[i].nd]; } bool uzyte[n + 1]; rep(i, n + 1) { uzyte[i] = false; } for (int v = 1; v <= n; v++) { int w = dokad[v]; if (uzyte[w]) { dokad[v] = v; continue; } if (w != v && dokad[w] == v) { uzyte[v] = true; uzyte[w] = true; } } int ans = 0; int ile[n + 1]; rep(i, n + 1) { ile[i] = 0; } for (int v = 1; v <= n; v++) { int w = dokad[v]; if (uzyte[w]) { dokad[v] = v; } if (dokad[v] != v) { ile[dokad[v]]++; } } queue<int> q; for (int v = 1; v <= n; v++) { if (uzyte[v]) continue; if (ile[v] == 0) { q.push(v); } } while (!q.empty()) { int v = q.front(); q.pop(); if (uzyte[v]) continue; int w = dokad[v]; if (uzyte[w] || w == v) { ans++; uzyte[v] = true; } else { uzyte[v] = true; uzyte[w] = true; ans++; int z = dokad[w]; ile[z]--; if (!uzyte[z] && ile[z] == 0) { q.push(z); } } } for (int v = 1; v <= n; v++) { if (uzyte[v]) continue; int w = v; int s = 0; while (!uzyte[w]) { uzyte[w] = true; w = dokad[w]; s++; } ans += (s/2); ans += (s % 2); } cout << ans << '\n'; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...