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