Submission #579883

#TimeUsernameProblemLanguageResultExecution timeMemory
579883drdilyorXor Sort (eJOI20_xorsort)C++17
0 / 100
1 ms468 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> #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 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]); } 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 { function<void()> action = [&]() { for (int i = 0; i < n; i++) { if (rev[i].empty() && !inrel[adj[i]]) { int a1 = i, a2 = adj[i]; assert(!inrel[a1]); rev[adj[a2]].erase(a2); for (int i : rev[a2]) { adj[i] = i; rev[i].insert(i); } rev[a1] = {a2}; adj[a2] = a1; adj[a1] = a2; inrel[a1] = inrel[a2] = 1; inrel_count+= 2; res++; debug(i, adj, rev, inrel); } } }; action(); vi adj_p = adj; action(); assert(adj == adj_p); } // polygons shall no longer survive if (inrel_count != n) { vi visited(n, 0); function<pair<int,int>(int)> dfs = [&](int i) -> pair<int,int> { if (inrel[i]) return {-1, -1}; if (visited[i]) { return {i, 0}; } visited[i] = 1; auto [end, depth] = dfs(adj[i]); if (i == -1) return {end, depth}; depth++; assert(depth != 2); if (end == i) { res += (depth + 1) / 2; debug("cycle", i, depth, res); return {-1, -1}; } return {i, depth}; }; for (int i = 0; i < n; i++) { dfs(i); } } cout << res; return 0; } signed main() { cin.tie(0)->sync_with_stdio(0); int t = 1; //cin >> t; while (t-- && cin) { if (solve()) break; #ifdef ONPC cout << "____________________" << endl; #endif } return 0; }

Compilation message (stderr)

xorsort.cpp: In function 'int solve()':
xorsort.cpp:10:24: warning: statement has no effect [-Wunused-value]
   10 |     #define debug(...) 42
      |                        ^~
xorsort.cpp:58:5: note: in expansion of macro 'debug'
   58 |     debug(name);
      |     ^~~~~
xorsort.cpp:10:24: warning: statement has no effect [-Wunused-value]
   10 |     #define debug(...) 42
      |                        ^~
xorsort.cpp:59:5: note: in expansion of macro 'debug'
   59 |     debug(adj, rev, inrel);
      |     ^~~~~
xorsort.cpp: In lambda function:
xorsort.cpp:10:24: warning: statement has no effect [-Wunused-value]
   10 |     #define debug(...) 42
      |                        ^~
xorsort.cpp:81:21: note: in expansion of macro 'debug'
   81 |                     debug(i, adj, rev, inrel);
      |                     ^~~~~
xorsort.cpp: In lambda function:
xorsort.cpp:10:24: warning: statement has no effect [-Wunused-value]
   10 |     #define debug(...) 42
      |                        ^~
xorsort.cpp:106:17: note: in expansion of macro 'debug'
  106 |                 debug("cycle", i, depth, res);
      |                 ^~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...