Submission #1237291

#TimeUsernameProblemLanguageResultExecution timeMemory
1237291TimoshMechanical Doll (IOI18_doll)C++20
6 / 100
51 ms12216 KiB
#include "bits/stdc++.h" #include "doll.h" using namespace std; void create_circuit(int M, vector<int> A) { int N = A.size(); vector<int> C(M + 1); C[0] = A[0]; vector<int> X, Y; vector<int> move(3e5); vector<vector<int>> g(M + 1); for (int i = 0; i < N - 1; i++) g[A[i]].push_back(A[i + 1]); g[A.back()].push_back(0); for (int i = 1; i <= M; i++) { int sz = g[i].size(); if (sz == 0) continue; if (sz == 1) { C[i] = g[i][0]; continue; } int x = 0; while ((1ll << x) < sz) x++; int ind = X.size() + 1; ind *= -1; C[i] = ind; int r = (1ll << x) - sz; reverse(g[i].begin(), g[i].end()); while (sz < (1ll << x)) sz++, g[i].push_back(ind); reverse(g[i].begin(), g[i].end()); vector<int> nw = g[i]; auto build = [&](auto build, int L, int R) -> void { if (L == R - 1) X.push_back(1e9), Y.push_back(1e9); else { int a = X.size() + 1; X.push_back(ind); Y.push_back(-a - 1); int m = (L + R) / 2; build(build, m + 1, R); if (m < r) return; X[a - 1] = -(X.size() + 1); build(build, L, m); } }; build(build, 0, sz - 1); for (int x = 0; x < sz; x++) { if (g[i][x] == ind) continue; int pv = -1; int cur = -ind; while (abs(cur) != 1e9) pv = cur, cur = -((move[cur]++) % 2 ? Y[cur - 1] : X[cur - 1]); if (move[pv] % 2) X[pv - 1] = g[i][x]; else Y[pv - 1] = g[i][x]; } } answer(C, X, Y); }
#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...