제출 #1048249

#제출 시각아이디문제언어결과실행 시간메모리
1048249Alihan_8자동 인형 (IOI18_doll)C++17
47 / 100
178 ms28992 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 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 ? A[p] : -1); } else Y[v - 1] = (p < 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); { // compressing vector <int> is(ct + 1); auto dfs = [&](auto dfs, int v) -> bool{ if ( L[v] == -1 ){ // leaf return X[v] != -1 || Y[v] != -1; } bool x = dfs(dfs, L[v]) || dfs(dfs, R[v]); if ( !x ) is[v] = 1; 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 ( is[v] ){ x[u - 1] = y[u - 1] = -1; return u; } if ( L[v] == -1 ){ // leaf x[u - 1] = X[v - 1]; y[u - 1] = Y[v - 1]; } else{ x[u - 1] = -get(L[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); } }

컴파일 시 표준 에러 (stderr) 메시지

doll.cpp: In function 'void create_circuit(int, std::vector<int>)':
doll.cpp:84:8: warning: variable 'dfs' set but not used [-Wunused-but-set-variable]
   84 |   auto dfs = [&](auto dfs, int v) -> bool{
      |        ^~~
#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...