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