Submission #414177

#TimeUsernameProblemLanguageResultExecution timeMemory
414177TemmieMechanical Doll (IOI18_doll)C++17
47 / 100
315 ms16180 KiB
#include "doll.h" #include <bits/stdc++.h> //void answer(std::vector <int> c, std::vector <int> x, std::vector <int> y) { //std::cerr << "answered" << std::endl; //for (int i : c) std::cerr << i << " "; //std::cout << std::endl; //for (int i : x) std::cerr << i << " "; //std::cout << std::endl; //for (int i : y) std::cerr << i << " "; //std::cout << std::endl; //} struct Switch { int id; int left, right; int depth = 1; bool dir = false; // false = left , true = right }; std::vector <Switch> sw; void make_tree(int node, int depth, int max_depth) { if (depth == max_depth) return; assert(depth < max_depth); sw[node].left = (int)sw.size() + 1; sw[node].right = (int)sw.size() + 2; sw.push_back({ (int)sw.size() + 1, -1, -1, depth + 1 }); sw.push_back({ (int)sw.size() + 1, -1, -1, depth + 1 }); make_tree(sw[node].left - 1, depth + 1, max_depth); make_tree(sw[node].right - 1, depth + 1, max_depth); } void find_exits(int node, int depth, int max_depth, int exit_number) { if (depth == max_depth) { if (sw[node].dir == false) { sw[node].left = exit_number; } else { sw[node].right = exit_number; } sw[node].dir ^= 1; return; } assert(depth < max_depth); if (sw[node].dir == false) { find_exits(sw[node].left - 1, depth + 1, max_depth, exit_number); } else { find_exits(sw[node].right - 1, depth + 1, max_depth, exit_number); } sw[node].dir ^= 1; } void create_circuit(int m, std::vector <int> a) { int n = a.size(); int size = 1; int depth = 0; while (size < n) { size <<= 1; depth++; } //std::cerr << n << ": " << size << ", " << depth <<std::endl; sw.push_back({ 1, -1, -1 }); make_tree(0, 1, depth); int cnt = 0; for (int i = 0; i < n - 1; i++) { find_exits(0, 1, depth, a[i + 1]); cnt++; } for (; cnt < size - 1; cnt++) { find_exits(0, 1, depth, -1); } find_exits(0, 1, depth, 0); std::vector <int> c(m + 1), x(sw.size()), y(sw.size()); c[0] = a[0]; for (int i = 1; i <= m; i++) { c[i] = -1; } for (auto node : sw) { if (node.depth != depth) { x[node.id - 1] = -node.left; y[node.id - 1] = -node.right; } else { x[node.id - 1] = node.left; y[node.id - 1] = node.right; } } //for (auto s : sw) { //std::cerr << s.id << " " << s.left << ", " << s.right << " and " //<< s.depth << " dir: " << s.dir << std::endl; //} answer(c, x, y); } //int main() { //for (int i = 1; i <= 10; i++) { //std::vector <int> a(i, 0); //create_circuit(1, a); //} //std::vector <int> a = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; //int m = 11; //create_circuit(m, a); //std::vector <int> a = { 1, 2, 1, 3 }; //int m = 4; //create_circuit(m, a); //}
#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...