Submission #579908

#TimeUsernameProblemLanguageResultExecution timeMemory
579908drdilyorLove Polygon (BOI18_polygon)C++17
100 / 100
389 ms33276 KiB
#if defined(ONPC) && !defined(_GLIBCXX_ASSERTIONS) #define _GLIBCXX_ASSERTIONS #endif #include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/detail/standard_policies.hpp> #define cerr cout #ifdef ONPC #include "t_debug.cpp" #else #define debug(...) 42 #endif #define allit(a) (a).begin(), (a).end() #define sz(a) ((int) (a).size()) using namespace std; using ll = long long; using vi = vector<int>; namespace pd = __gnu_pbds; template<typename K> using ordered_set = pd::tree<K, pd::null_type, less<int>, pd::rb_tree_tag, pd::tree_order_statistics_node_update>; template<typename... T> using gp_hash_table = pd::gp_hash_table<T...>;//simple using statement gives warnings const int INF = 1e9; const ll INFL = 1e18; const int N = 1e5; const int RANDOM = chrono::high_resolution_clock::now().time_since_epoch().count(); mt19937 rng(RANDOM); int ans; void confirm(int i) { #ifdef ONPC if (i == ans) cout << "ok " << i << endl; else cout << "wrong " << i << ", expected " << ans << endl; #else cout << i << '\n'; #endif } int solve() { int n; cin >> n; map<string, int> code; vector<string> name(n); vi adj(n); vector<set<int>> rev(n); for (int i = 0, t = 0; i < n; i++) { string u, v; cin >> u >> v; if (code.count(u) == 0) { name[t] = u; code[u] = t++; } if (code.count(v) == 0) { name[t] = v; code[v] = t++; } adj[code[u]] = code[v]; rev[code[v]].insert(code[u]); } if (n % 2 == 1) {confirm(-1); return 0;} vi inrel(n); int inrel_count = 0; for (int i = 0; i <n; i++) { inrel_count += inrel[i] = ( i != adj[i] && adj[adj[i]] == i); } debug(name); debug(adj, rev, inrel); int res = 0; //unloved ones shall be matched { set<int> unloved; auto set_love = [&](int from, int to) { rev[adj[from]].erase(from); rev[to].insert(from); adj[from] = to; }; auto check = [&](int i) { if (rev[i].empty()) { if (inrel[adj[i]]) {set_love(i, i); return false; } else {unloved.insert(i); return true; } } return false; }; function<void()> action = [&]() { for (int i = 0; i < n; i++) { check(i); } while (!unloved.empty()) { int i = *unloved.begin(); if (check(i)) { int j = adj[i]; // remove those who love j for (int k : rev[j]) { adj[k] = k; rev[k].insert(k); } int dangling = adj[j]; rev[j].clear(); set_love(j, i); set_love(i, j); inrel[j] = inrel[i] = 1; inrel_count += 2; res++; check(dangling); } debug(i, adj, rev, inrel, unloved); unloved.erase(i); } }; action(); vi adj_p = adj; debug("run 2"); action(); assert(adj == adj_p); for (int i = 0; i < n; i++) { assert(rev[i].size() == 1); } } debug(res); // polygons shall no longer survive if (inrel_count != n) { vi visited(n, 0); auto cycle = [&](int i, int depth) { res += (depth + 1) / 2; debug("cycle", i, depth); }; function<pair<int,int>(int)> dfs = [&](int i) -> pair<int,int> { if (inrel[i]) return {-1, -1}; if (visited[i]) { return {i, 0}; } debug("dfs", i); visited[i] = 1; auto [end, depth] = dfs(adj[i]); if (end == -1) return {-1, -1}; depth++; inrel[i] = 1; if (end == i) { cycle(end, depth); assert(depth != 2); return {-1, -1}; } return {end, depth}; }; for (int i = 0; i < n; i++) { if (!inrel[i] && !visited[i]) { auto [end, depth] = dfs(i); if (end != -1) cycle(end, depth); } } } confirm(res); return 0; } signed main() { cin.tie(0)->sync_with_stdio(0); int t = 1; #ifdef ONPC cin >> t; while (t-- && cin) { cin >> ans; if (!cin) break; #else while (t-- && cin) { #endif if (solve()) break; #ifdef ONPC cout << "____________________" << endl; #endif } return 0; }

Compilation message (stderr)

polygon.cpp: In function 'int solve()':
polygon.cpp:11:24: warning: statement has no effect [-Wunused-value]
   11 |     #define debug(...) 42
      |                        ^~
polygon.cpp:72:5: note: in expansion of macro 'debug'
   72 |     debug(name);
      |     ^~~~~
polygon.cpp:11:24: warning: statement has no effect [-Wunused-value]
   11 |     #define debug(...) 42
      |                        ^~
polygon.cpp:73:5: note: in expansion of macro 'debug'
   73 |     debug(adj, rev, inrel);
      |     ^~~~~
polygon.cpp: In lambda function:
polygon.cpp:11:24: warning: statement has no effect [-Wunused-value]
   11 |     #define debug(...) 42
      |                        ^~
polygon.cpp:115:17: note: in expansion of macro 'debug'
  115 |                 debug(i, adj, rev, inrel, unloved);
      |                 ^~~~~
polygon.cpp: In function 'int solve()':
polygon.cpp:11:24: warning: statement has no effect [-Wunused-value]
   11 |     #define debug(...) 42
      |                        ^~
polygon.cpp:122:9: note: in expansion of macro 'debug'
  122 |         debug("run 2");
      |         ^~~~~
polygon.cpp:11:24: warning: statement has no effect [-Wunused-value]
   11 |     #define debug(...) 42
      |                        ^~
polygon.cpp:130:5: note: in expansion of macro 'debug'
  130 |     debug(res);
      |     ^~~~~
polygon.cpp: In lambda function:
polygon.cpp:11:24: warning: statement has no effect [-Wunused-value]
   11 |     #define debug(...) 42
      |                        ^~
polygon.cpp:136:13: note: in expansion of macro 'debug'
  136 |             debug("cycle", i, depth);
      |             ^~~~~
polygon.cpp: In lambda function:
polygon.cpp:11:24: warning: statement has no effect [-Wunused-value]
   11 |     #define debug(...) 42
      |                        ^~
polygon.cpp:141:13: note: in expansion of macro 'debug'
  141 |             debug("dfs", i);
      |             ^~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...