Submission #1041022

#TimeUsernameProblemLanguageResultExecution timeMemory
1041022NeroZeinMechanical Doll (IOI18_doll)C++17
10 / 100
57 ms11072 KiB
#include "doll.h" #include <bits/stdc++.h> using namespace std; int idd; int n, m; vector<int> a; vector<int> state; vector<int> c, x, y; void build(int nd, int l, int r, int elements) { assert(l != r); int mid = (l + r) >> 1; int sz = 1; while (sz * 2 <= min(elements, r - mid)) { sz *= 2; } if (mid + 1 < r) { int rx = --idd; x.push_back(0); y.push_back(0); y[-nd - 1] = rx; build(rx, mid + 1, r, sz); } if (sz == elements) { x[-nd - 1] = -1; } else if (l < mid) { int lx = --idd; x.push_back(0); y.push_back(0); x[-nd - 1] = lx; build(lx, l, mid, elements - sz); } } void dfs(int v, int ptr) { if (v == 0) { return; } if (v > 0) { dfs(c[v], ptr + 1); } else { if (state[-v - 1] == 0) { if (!x[-v - 1]) { x[-v - 1] = a[ptr]; } state[-v - 1] ^= 1; dfs(x[-v - 1], ptr); } else { if (!y[-v - 1]) { y[-v - 1] = a[ptr]; } state[-v - 1] ^= 1; dfs(y[-v - 1], ptr); } } } void create_circuit(int m_, vector<int> a_) { m = m_; a = a_; a.push_back(0); n = (int) a.size(); idd = -1; x.push_back(0); y.push_back(0); int b = 1; while (b < n) { b *= 2; } build(-1, 0, b - 1, n); c.assign(m + 1, -1); state.resize(-idd); dfs(-1, 0); if (-idd > (int) log2(n) + n) { assert(n <= 100); } //assert(-idd <= (int) log2(n) + n); 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...