Submission #1245638

#TimeUsernameProblemLanguageResultExecution timeMemory
1245638kunzaZa183Mechanical Doll (IOI18_doll)C++20
100 / 100
111 ms10212 KiB
#include "doll.h" #include <bits/stdc++.h> using namespace std; void create_circuit(int M, vector<int> A) { const int mn = 2e5 + 5; vector<int> lg2(mn); int cur = 1, ct = 0; for (int i = 0; i < mn; i++) { if (i > cur) { cur *= 2; ct++; } lg2[i] = ct; } A.push_back(0); int N = A.size(); vector<int> c(M + 1), x, y; vector<int> stat; int num = N; int pow2 = (1 << lg2[num]); function<int(int, int, int)> build = [&](int curin, int curl, int curr) { if (curl >= num) { return INT_MIN; } if (curl == curr) { return INT_MAX; } int a = build(curin * 2 + 1, curl, (curl + curr) / 2), b = build(curin * 2 + 2, (curl + curr) / 2 + 1, curr); x.push_back(b), y.push_back(a); stat.push_back(0); return -(int(x.size())); }; int id = build(0, 0, pow2 - 1); int in = 0; for (int j = 0; j < pow2; j++) { vector<int> dfsst; dfsst.push_back(id); while (!dfsst.empty()) { int cur = dfsst.back(); dfsst.pop_back(); if (cur >= 0) continue; int tmp; if (stat[-cur - 1] == 0) { tmp = x[-cur - 1]; } else { tmp = y[-cur - 1]; } if (stat[-cur - 1] == 0) { if (tmp == INT_MAX) x[-cur - 1] = A[in++]; else if (tmp == INT_MIN) x[-cur - 1] = id; else dfsst.push_back(tmp); } else { if (tmp == INT_MAX) y[-cur - 1] = A[in++]; else if (tmp == INT_MIN) y[-cur - 1] = id; else dfsst.push_back(tmp); } stat[-cur - 1] = 1 - stat[-cur - 1]; } } for (int i = 0; i <= M; i++) { c[i] = id; } 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...