Submission #862862

#TimeUsernameProblemLanguageResultExecution timeMemory
862862maks007Love Polygon (BOI18_polygon)C++14
54 / 100
286 ms25036 KiB
//Bismi Allah #include "bits/stdc++.h" using namespace std; signed main () { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n; cin >> n; map <string,int> mp; vector <int> used(n, 0), dp(n, 0), g[n], unite(n, 0), loved(n, 0), rk(n, 0); function <void(int,int)> dfs=[&](int v, int p) { used[v] = 1; rk[v] = 1; for(auto u : g[v]) { if(used[u]) continue; dfs(u, v); rk[v] += rk[u]; } if(unite[v]) return; if(p != -1 && unite[p] == 0) { unite[p] = 1; unite[v] = 1; } }; for(int i = 0; i < n; i ++) { string u, v; cin >> u >> v; if(mp.count(u) == 0) mp[u] = mp.size(); if(mp.count(v) == 0) mp[v] = mp.size(); loved[mp[v]] ++; if(mp[u] == mp[v]) continue; g[mp[u]].push_back(mp[v]); g[mp[v]].push_back(mp[u]); } if(*min_element(loved.begin(), loved.end()) >= 1) { if(n % 2 == 1) { // assert(false); cout << -1; return 0; } int ans = 0, mod = 0; for(int i = 0; i < n; i ++) { if(used[i]) continue; dfs(i, -1); if(rk[i] == 2) continue; ans += rk[i] / 2; mod += (rk[i] % 2); } if(mod % 2 == 1) cout << -1; else cout << ans + mod; return 0; } if(n % 2 == 1) { // assert(false); cout << -1; return 0; } int ans = 0, mod = 0; for(int i = 0; i < n; i ++) { if(used[i]) continue; dfs(i, -1); } for(auto i : unite) { ans += (i == 1); mod += (i == 0); } cout << ans/2+mod; 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...