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