Submission #1244946

#TimeUsernameProblemLanguageResultExecution timeMemory
1244946lncreedibleMechanical Doll (IOI18_doll)C++20
84 / 100
97 ms11016 KiB
#include "doll.h" #include <bits/stdc++.h> using namespace std; #define mkp make_pair #define eb emplace_back using ii = pair<int, int>; using iii = pair<ii, int>; int swid = -1; vector<int> sx, sy; vector<iii> go(int h, int rem) { vector<iii> ret; int me = ++swid; if (h == 1) { ret.eb(mkp(me, 1), 2); if (rem != 1) ret.eb(mkp(me, 0), 1); return ret; } sy[me] = -swid - 2; vector<iii> left, right = go(h - 1, rem); if (rem > (1 << (h - 1))) { sx[me] = -swid - 2; left = go(h - 1, rem - (1 << (h - 1))); } for (auto &p : left) ret.eb(mkp(p.first.first, p.first.second), p.second * 2 - 1); for (auto &p : right) ret.eb(mkp(p.first.first, p.first.second), p.second * 2); return ret; } bool cmp(const iii &a, const iii &b) { return a.second < b.second; } void create_circuit(int m, vector<int> seq) { seq.eb(0); int sz = seq.size(); vector<int> conn(m + 1, -1); sx.assign(2 * sz, -1); sy.assign(2 * sz, -1); vector<iii> order = go(32 - __builtin_clz(sz), sz); sort(order.begin(), order.end(), cmp); for (int i = 0; i < sz; ++i) { if (order[i].first.second) sy[order[i].first.first] = seq[i]; else sx[order[i].first.first] = seq[i]; } while (!sx.empty() && sx.back() == -1 && sy.back() == -1) { sx.pop_back(); sy.pop_back(); } answer(conn, sx, sy); }
#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...