Submission #1298574

#TimeUsernameProblemLanguageResultExecution timeMemory
1298574Trn115Love Polygon (BOI18_polygon)C++20
0 / 100
223 ms22108 KiB
#include <bits/stdc++.h> #define int long long using namespace std; constexpr int N = 1e5+5; int n, id; map<string, int> m; int p[N]; set<int> rev[N]; int iso; bool deleted[N]; int progress = 0, res = 0; vector<int> stk; set<int> nm; // Normal // Single // Isolated // True-Deleted void solve() { for (int i = 1; i <= n; ++i) { if (!deleted[i]) { if (p[p[i]] == i && p[i] != i) { deleted[i] = true; deleted[p[i]] = true; } else if (rev[i].empty()) { stk.push_back(i); } else { nm.insert(i); } } } while (!stk.empty() || !nm.empty()) { int v; if (!stk.empty()) { v = stk.back(); stk.pop_back(); } else { v = *nm.begin(); nm.erase(nm.begin()); } int u = p[v]; if (u == v || deleted[u]) { ++iso; } else { nm.erase(u); deleted[v] = true; deleted[u] = true; ++res; } } res += iso; cout << res; } signed main() { cin.tie(0)->sync_with_stdio(0); cin >> n; for (int i = 1; i <= n; ++i) { string s, t; cin >> s >> t; if (m.find(s) == m.end()) m[s] = ++id; if (m.find(t) == m.end()) m[t] = ++id; int si = m[s], ti = m[t]; p[si] = ti; rev[ti].insert(si); } if (n % 2 == 1) { cout << -1; return 0; } solve(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...