제출 #1259507

#제출 시각아이디문제언어결과실행 시간메모리
1259507inkvizytorLove Polygon (BOI18_polygon)C++20
25 / 100
191 ms32140 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long void licz(int v, vector<vector<int>> &r, vector<bool> &odw, vector<vector<int>> &dp) { odw[v] = 1; vector<vector<int>> p; for (int i : r[v]) { licz(i, r, odw, dp); p.push_back(dp[i]); } bool b = 1; int s = 0; for (auto x : p) { if (b && (x[0] == x[1])) { s += x[0]+1; b = 0; } else { s += x[1]; } } dp[v][1] = s; dp[v][0] = s-(b^1); } void znajdz(int v, vector<int> &f, vector<vector<int>> &r, vector<bool> &odw, vector<vector<int>> &dp, int &w) { while (!odw[v]) { odw[v] = 1; v = f[v]; } if (v == f[v]) { for (int u : r[v]) { if (u == v) { continue; } licz(u, r, odw, dp); w += dp[u][1]; } return; } if (f[f[v]] == v) { w += 2; for (int u : r[v]) { if (u == f[v]) { continue; } licz(u, r, odw, dp); w += dp[u][1]; } for (int u : r[f[v]]) { if (u == v) { continue; } licz(u, r, odw, dp); w += dp[u][1]; } return; } int x = 0; for (int i = 0; i < (int)r[f[v]].size(); i++) { if (r[f[v]][i] == v) { r[f[v]].erase(r[f[v]].begin()+i); break; } } licz(v, r, odw, dp); x = dp[v][1]; int y = 1; for (int i = 0; i < (int)r[f[f[v]]].size(); i++) { if (r[f[f[v]]][i] == f[v]) { r[f[f[v]]].erase(r[f[f[v]]].begin()+i); break; } } for (int u : r[v]) { licz(u, r, odw, dp); y += dp[u][1]; } for (int u : r[f[v]]) { licz(u, r, odw, dp); y += dp[u][1]; } w += max(x, y); } int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n; cin >> n; map<string, int> mp; int c = 0; vector<int> f (n); vector<vector<int>> r (n); for (int i = 0; i < n; i++) { string a, b; cin >> a >> b; int x, y; if (!mp.contains(a)) { mp[a] = c; c++; } if (!mp.contains(b)) { mp[b] = c; c++; } x = mp[a]; y = mp[b]; f[x] = y; r[y].push_back(x); } if (n%2) { cout << -1 << '\n'; return 0; } vector<vector<int>> dp (n, vector<int> (2)); int w = 0; vector<bool> odw (n, 0), odw2 (n, 0); for (int i = 0; i < n; i++) { if (!odw[i]) { znajdz(i, f, r, odw, dp, w); } } cout << n-w << '\n'; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...