Submission #1048343

#TimeUsernameProblemLanguageResultExecution timeMemory
1048343Alihan_8Mechanical Doll (IOI18_doll)C++17
76.59 / 100
161 ms23716 KiB
#include "doll.h" #include <bits/stdc++.h> using namespace std; #define pb push_back #define ln '\n' #define all(x) x.begin(), x.end() template <class F, class S> bool chmax(F &u, const S &v){ bool flag = false; if ( u < v ){ u = v; flag |= true; } return flag; } void create_circuit(int m, std::vector<int> A) { int n = A.size(), x = (n + 1) / 2; int lg = __lg(x); if ( (1 << lg) < x ) ++lg; vector <int> L(2 * n), R(2 * n); int ct = 0; auto build_tree = [&](auto build_tree, int v, int d) -> void{ chmax(ct, v); L[v] = R[v] = -1; if ( d == 0 ) return; L[v] = v * 2, R[v] = v * 2 + 1; build_tree(build_tree, v * 2, d - 1); build_tree(build_tree, v * 2 + 1, d - 1); }; build_tree(build_tree, 1, lg); vector <int> C(m + 1, -1), X(ct), Y(ct); C[0] = A[0]; vector <int> state(ct + 1); auto f = [&](int v){ return v - (1 << (lg + 1)) + 1; }; auto dfs = [&](auto dfs, int v, int p) -> void{ state[v] ^= 1; if ( v == ct && !state[v] ){ // last Vertex Y[v - 1] = 0; return; } if ( L[v] == -1 ){ // leaf vertex bool nxt = false; if ( state[v] > 0 ){ X[v - 1] = (p < n && f(v * 2) < n ? A[p] : -1); nxt = X[v - 1] != -1; } else{ Y[v - 1] = (p < n && f(v * 2 + 1) < n ? A[p] : -1); nxt = Y[v - 1] != -1; } dfs(dfs, 1, p + nxt); return; } X[v - 1] = -L[v]; Y[v - 1] = -R[v]; if ( state[v] ){ dfs(dfs, L[v], p); } else dfs(dfs, R[v], p); }; dfs(dfs, 1, 1); { // compressing vector <int> good(ct + 1); auto dfs = [&](auto dfs, int v) -> int{ auto &x = good[v]; if ( L[v] == -1 ){ // leaf return x = (X[v - 1] != -1 || Y[v - 1] != -1); } x = dfs(dfs, L[v]) | dfs(dfs, R[v]); return x; }; dfs(dfs, 1); int cnt = 0; map <int,int> id; vector <int> x, y; auto get = [&](int u){ if ( !id.count(u) ){ id[u] = ++cnt; x.pb(0), y.pb(0); } return id[u]; }; auto trav = [&](auto trav, int v) -> int{ int u = get(v); if ( L[v] == -1 ){ // leaf x[u - 1] = X[v - 1]; y[u - 1] = Y[v - 1]; } else{ if ( good[L[v]] ){ x[u - 1] = -get(L[v]); } else x[u - 1] = -1; if ( good[R[v]] ){ y[u - 1] = -get(R[v]); } else y[u - 1] = -1; for ( auto j: {L[v], R[v]} ){ if ( good[j] ) trav(trav, j); } } return u; }; trav(trav, 1); 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...