Submission #835625

#TimeUsernameProblemLanguageResultExecution timeMemory
835625Kerim자동 인형 (IOI18_doll)C++17
100 / 100
113 ms23944 KiB
#include "doll.h" #include "bits/stdc++.h" #define pb(x) push_back(x) using namespace std; const int N = 4e5+5; vector<int> adj[N], id; int who[N], sw[N], S, XX[N], YY[N]; void f(int nd, int pos, int pw, int id){ if (!pw){ who[pos] = id; return; } sw[nd] ^= 1; if (sw[nd]) f(nd*2, pos, pw/2, id); else f(nd*2+1, pos+pw, pw/2, id); } int get_switch(){ return --S; } int dfs(int l, int r, int rem, int root, vector<int>&values){ if (r < rem) return root; if (l == r) return values[who[l]]; int nd = get_switch(); int mid = (l+r) >> 1; XX[-nd] = dfs(l, mid, rem, root, values); YY[-nd] = dfs(mid+1, r, rem, root, values); return nd; } int get_root(vector<int> &values){ int sz = values.size(); int pw = 1; while (pw < sz) pw *= 2; id.clear(); for (int i = 0; i < pw; i++) f(1, 0, pw/2, i), id.pb(i); for (int i = 0; i < pw-sz; i++) who[i] = pw; sort(id.begin(), id.end(), [&](int x, int y){ return (who[x] < who[y]); }); for (int i = 0; i < sz; i++) who[id[i]] = i; return dfs(0, pw-1, pw-sz, S-1, values); } void create_circuit(int M, vector<int> A) { A.pb(0); int entire_root = get_root(A); vector<int> C(M + 1); for (int i = 0; i <= M; ++i) C[i] = entire_root; vector<int> X(-S), Y(-S); for (int i = 1; i <= -S; i++) X[i-1] = XX[i], Y[i-1] = YY[i]; 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...