Submission #1241103

#TimeUsernameProblemLanguageResultExecution timeMemory
1241103nikdMechanical Doll (IOI18_doll)C++20
100 / 100
58 ms12440 KiB
#include "doll.h" #include <bits/stdc++.h> #include <vector> using namespace std; void create_circuit(int M, std::vector<int> A) { int n = A.size(); vector<int> c(M+1, -1); if(n == 1){ c[0] = A[0]; for(int i = 1; i<=M; i++){ c[i] = 0; } answer(c, {}, {}); return; } vector<int> x(2*n, INT_MAX); // da resizare vector<int> y(2*n, INT_MAX); int p2 = 1; int h = 0; while(p2<n){ p2 <<=1; h++; } int dlt = p2-n; int s= 1; vector<pair<int, int*>> leaf; auto build = [&](auto&& build, int curr, int md, int curr_h)->void{ int pow2 = (1<<curr_h); int md1 = md; int md2 = md+pow2; pow2 <<= 1; curr_h++; if((1<<(h-curr_h)) <= dlt){ dlt -= (1<<(h-curr_h)); x[curr-1] = -1; } if(curr_h == h){ if(x[curr-1] != -1) leaf.push_back({md1, &x[curr-1]}); leaf.push_back({md2, &y[curr-1]}); } else{ if(x[curr-1] != -1){ x[curr-1] = -(++s); y[curr-1] = -(++s); build(build, -x[curr-1], md1, curr_h); build(build, -y[curr-1], md2, curr_h); } else{ y[curr-1] = -(++s); build(build, -y[curr-1], md2, curr_h); } } }; build(build, 1, 0, 0); sort(leaf.begin(), leaf.end()); c[0] = A[0]; c[A[0]] = -1; A.push_back(0); for(int i = 0; i<n; i++){ *leaf[i].second = A[i+1]; if(i != n-1) c[A[i+1]] = -1; } while(x.back() == INT_MAX){ x.pop_back(); y.pop_back(); } 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...