Submission #1299317

#TimeUsernameProblemLanguageResultExecution timeMemory
1299317harryleeeLove Polygon (BOI18_polygon)C++20
25 / 100
152 ms9516 KiB
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5;
int n, nxt[maxn + 1], vis[maxn + 1], in[maxn + 1], rep, res;
vector<vector<int>> vec;
bool in_cycle[maxn + 1], change[maxn + 1];

inline void input(){
    map<string, int> mp;
    int dem = 0;
    cin >> n;
    for (int i = 1; i <= n; ++i){
        string u, v; cin >> u >> v;
        if (mp.find(u) == mp.end()){
            mp[u] = ++dem;
        }
        if (mp.find(v) == mp.end()){
            mp[v] = ++dem;
        }
        nxt[mp[u]] = mp[v];
        in[mp[v]]++;
        // cout << mp[u] << ' ' << mp[v] << '\n';
    }
    return;
}

inline void get_cycle(int start){
    vector<int> res;
    int u = start;
    while(true){
        in_cycle[u] = true;
        res.push_back(u);
        if (nxt[u] == start) break;
        u = nxt[u];   
    }
    vec.push_back(res);
    // for  (int x : res) cout << x << ' ';
    // cout << '\n';
    return;
}

inline void find_cycle(int u, int th){
    while(true){
        vis[u] = th;
        if (vis[nxt[u]] == 0){
            u = nxt[u];
        }
        else if (vis[nxt[u]] == th){
            get_cycle(nxt[u]);
            break;
        }
        else if (vis[nxt[u]] != th){
            break;
        }
    }
    return;
}

inline void DFS(int u){
    if (in_cycle[u]) return;
    // cout << u << '\n';
    res++;
    vis[u] = 1;
    int v = nxt[u];
    if (!vis[v]){
        vis[v] = 1;
        DFS(nxt[v]);
    }
    return;
}

inline void solve(const vector<int>& v){
    if (v.size() == 2 && vis[v[0]] == 0 && vis[v[1]] == 0) 
        return;
    vector<int> num;
    int sum = 0;
    for (int u : v){
        if (vis[u]){
            num.push_back(sum);
            sum = 0;
        }
        else sum++;
    }
    if (num.empty()) num.push_back(sum);
    else num[0] += sum;
    for (int x : num) res += (x / 2) + (x % 2);
    return;
}

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    input();
    if ((n % 2) != 0){
        cout << -1;
        return 0;
    }
    memset(vis, 0, sizeof(vis));
    memset(in_cycle, false, sizeof(in_cycle));
    for (int i = 1; i <= n; ++i) if (vis[i] == 0){
        find_cycle(i, ++rep);
    }

    memset(vis, 0, sizeof(vis));
    for (int i = 1; i <= n; ++i) if (!vis[i] && in[i] == 0){
        DFS(i);
    }

    for (const vector<int>& v : vec){
        solve(v);
    }

    cout << res << '\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...