제출 #1048308

#제출 시각아이디문제언어결과실행 시간메모리
1048308Alihan_8자동 인형 (IOI18_doll)C++17
47 / 100
101 ms12740 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; }; 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 if ( state[v] > 0 ){ X[v - 1] = (p < n && f(v) < n ? A[p] : -1); } else Y[v - 1] = (p < n && f(v) < n ? A[p] : -1); dfs(dfs, 1, p + 1); 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); answer(C, X, Y); return; { // 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); } return x = (dfs(dfs, L[v]) || dfs(dfs, R[v])); }; 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]); } if ( good[R[v]] ){ y[u - 1] = -get(R[v]); } trav(trav, L[v]); trav(trav, R[v]); } return u; }; trav(trav, 1); for ( int i = 0; i <= m; i++ ){ cout << i << " " << C[i] << ln; } for ( int i = 0; i < (int)id.size(); i++ ){ cout << -(i + 1) << ' ' << x[i] << ln; cout << -(i + 1) << " " << y[i] << ln; } 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...