Submission #1299439

#TimeUsernameProblemLanguageResultExecution timeMemory
1299439harryleeeLove Polygon (BOI18_polygon)C++20
46 / 100
153 ms9768 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, in_cycle[maxn + 1];
vector<vector<int>> vec;
vector<int> q;

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 input(){
//    cin >> n;
//    for (int i = 1; i <= n; ++i){
//        int u, v; cin >> u >> v;
//        nxt[u] = v;
//        in[v]++;
//    }
//    return;
//}

inline void get_cycle(int start){
    vector<int> res;
    int u = start;
    while(true){
        in_cycle[u] = vec.size();
        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] != -1 || vis[u] != 0) return;
    if (in[u] > 1){
        q.push_back(u);
        return;
    }
    res++;
    vis[u] = 1;
    int v = nxt[u];
    if (in_cycle[v] != -1 && vec[in_cycle[v]].size() == 2) return;
    if (!vis[v]){
        vis[v] = 1;
        DFS(nxt[v]);
    }
    return;
}

inline void DFS1(int u){
    if (in_cycle[u] != -1 || vis[u] != 0) return;
    res++;
    vis[u] = 1;
    int v = nxt[u];
    if (in_cycle[v] != -1 && vec[in_cycle[v]].size() == 2) return;
    if (!vis[v]){
        vis[v] = 1;
        DFS1(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(){
//    freopen("CHUNG.INP", "r", stdin);
//    freopen("TEST1.OUT", "w", stdout);
    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, -1, 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 (in[i] == 0){
        DFS(i);
    }
    for (int i : q) if (!vis[i]){
        DFS1(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...