제출 #868382

#제출 시각아이디문제언어결과실행 시간메모리
868382abczz자동 인형 (IOI18_doll)C++14
100 / 100
93 ms10808 KiB
#include "doll.h" #include <iostream> #include <array> #include <vector> #define ll int using namespace std; ll n, k, cnt; bool B[400000]; vector <ll> C, X, Y; ll solve(ll l, ll r) { if (l == r && k-n < l) return 0; //cout << id << " " << l << " " << r << endl; if (k-n >= r) return 1; ll id = cnt++, mid = (l+r)/2; X.push_back(-1); Y.push_back(-1); X[id] = -solve(l, mid); Y[id] = -solve(mid+1, r); //cout << id+1 << " * " << X[id] << " " << Y[id] << endl; return id+1; } void get(ll x) { //cout << x << " "; x *= -1; --x; if (!B[x]) { B[x] ^= 1; if (X[x] != 0) get(X[x]); else { X[x] = k; return; } } else { B[x] ^= 1; if (Y[x] != 0) get(Y[x]); else { Y[x] = k; return; } } } void create_circuit(int M, std::vector<int> A) { n = A.size() + 1; for (int i=0; i<=M; ++i) C.push_back(-1); for (int i=18; i>=0; --i) { if (n <= (1LL << i)) k = (1LL << i); } solve(1, k); for (int i=1; i<n; ++i) { k = A[i-1]; get(-1); //cout << endl; } k = 0; get(-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...