Submission #1207672

#TimeUsernameProblemLanguageResultExecution timeMemory
1207672raphaelpMechanical Doll (IOI18_doll)C++20
6 / 100
1096 ms11452 KiB
#include "doll.h" #include <bits/stdc++.h> using namespace std; int rev(int x, int b) { int ans = 0; while (x) { b--; ans *= 2; ans += x % 2; x /= 2; } while (b--) ans *= 2; return ans; } void create_circuit(int M, vector<int> A) { int N = A.size(); vector<vector<int>> exits(M + 1); exits[0].push_back(A[0]); for (int i = 0; i < N - 1; i++) exits[A[i]].push_back(A[i + 1]); exits[A.back()].push_back(0); vector<int> X, Y, C(M + 1), state; for (int i = 0; i <= M; i++) { int last = X.size(); int x = exits[i].size(); if (x == 0) { C[i] = 0; continue; } C[i] = exits[i][0]; if (x == 1) continue; C[i] = -X.size() - 1; int y = pow(2, ceil(log2(x))); for (int j = 1; j < y; j++) { X.push_back(M + 1); Y.push_back(M + 1); state.push_back(0); if (2 * i < y) X[i] = -(last - 2 * i); if (2 * i + 1 < y) Y[i] = -(last + 2 * i + 1); } vector<int> targs(y - x, -last - 1); for (int j = 0; j < x; j++) targs.push_back(exits[i][j]); for (int j = 0; j < y; j++) { int pos = last; while (true) { state[pos] = 1 - state[pos]; if (state[pos]) { if (X[pos] == M + 1) { X[pos] = targs[j]; break; } pos = -X[pos] - 1; } else { if (Y[pos] == M + 1) { Y[pos] = targs[j]; break; } pos = -Y[pos] - 1; } } } } answer(C, X, Y); } /*int main() { int N, M; cin >> N >> M; vector<int> Tab(N); for (int i = 0; i < N; i++) cin >> Tab[i]; create_circuit(M, Tab); }*/
#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...