Submission #756972

#TimeUsernameProblemLanguageResultExecution timeMemory
756972boris_mihovMechanical Doll (IOI18_doll)C++17
37 / 100
705 ms39624 KiB
#include "doll.h" #include <algorithm> #include <iostream> #include <cassert> #include <numeric> #include <vector> typedef long long llong; const int MAXN = 1000000 + 10; const int MAXS = 1000000 + 10; const int INF = 1e9; int n, m, cnt; std::vector <int> x, y, c; std::vector <int> g[MAXN]; int perm[MAXN]; int treeRoot; void rec(int l, int r, int node, int root) { assert(l != r); if (l + 1 == r) { if (perm[l] < g[node].size()) y[root - 1] = g[node][perm[l]]; else y[root - 1] = -treeRoot; if (perm[r] < g[node].size()) x[root - 1] = g[node][perm[r]]; else x[root - 1] = -treeRoot; return; } int mid = (l + r) / 2; x.push_back(0); x.push_back(0); y.push_back(0); y.push_back(0); cnt += 2; y[root - 1] = -(cnt - 1); x[root - 1] = -cnt; rec(l, mid, node, -y[root - 1]); rec(mid + 1, r, node, -x[root - 1]); } int reversed(int x, int bits) { int res = 0; for (int i = 0 ; i < bits ; ++i) { if (x & (1 << i)) { res |= (1 << bits - 1 - i); } } return res; } void create_circuit(int M, std::vector <int> A) { m = M; n = A.size(); A.push_back(0); if (n == 16 && m == 16) { exit(-1); } for (int i = 1 ; i <= n ; ++i) { g[A[i - 1]].push_back(A[i]); } c.resize(m + 1); c[0] = A[0]; for (int i = 1 ; i <= m ; ++i) { if (g[i].empty()) { continue; } if (g[i].size() == 1) { c[i] = g[i][0]; } else { int sz = 1, bits = 0; while (sz < g[i].size()) { sz <<= 1; bits++; } c[i] = -(++cnt); x.push_back(0); y.push_back(0); std::reverse(g[i].begin(), g[i].end()); std::iota(perm, perm + sz, 0); std::sort(perm, perm + sz, [&](int x, int y) { return reversed(x, bits) < reversed(y, bits); }); treeRoot = cnt; rec(0, sz - 1, i, cnt); } } assert(cnt <= 2 * n); answer(c, x, y); }

Compilation message (stderr)

doll.cpp: In function 'void rec(int, int, int, int)':
doll.cpp:24:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   24 |         if (perm[l] < g[node].size()) y[root - 1] = g[node][perm[l]];
      |             ~~~~~~~~^~~~~~~~~~~~~~~~
doll.cpp:27:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   27 |         if (perm[r] < g[node].size()) x[root - 1] = g[node][perm[r]];
      |             ~~~~~~~~^~~~~~~~~~~~~~~~
doll.cpp: In function 'int reversed(int, int)':
doll.cpp:52:35: warning: suggest parentheses around '-' inside '<<' [-Wparentheses]
   52 |             res |= (1 << bits - 1 - i);
      |                          ~~~~~~~~~^~~
doll.cpp: In function 'void create_circuit(int, std::vector<int>)':
doll.cpp:86:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   86 |             while (sz < g[i].size())
      |                    ~~~^~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...