제출 #645802

#제출 시각아이디문제언어결과실행 시간메모리
645802slime자동 인형 (IOI18_doll)C++14
49 / 100
120 ms12100 KiB
#include "doll.h" #include "bits/stdc++.h" using namespace std; void create_circuit(int M, std::vector<int> A); void answer(std::vector<int> C, std::vector<int> X, std::vector<int> Y); int lg(int x) { return 32 - __builtin_clz(x) - 1; } void create_circuit(int M, std::vector<int> A) { int N = A.size(); int freq[M + 1]; for(int i=0; i<=M; i++) freq[i] = 0; for(int i=0; i<N; i++) freq[A[i]]++; freq[0]++; vector<int> C(M + 1); for(int i=0; i<=M; i++) C[i] = 0; C[0] = A[0]; vector<int> sequence; for(int i=0; i<N; i++) { if(freq[A[i]] == 1) { C[A[i]] = (i+1 == N ? 0 : A[i+1]); } else { sequence.push_back((i+1 == N ? 0 : A[i+1])); C[A[i]] = -1; } } if(sequence.empty()) { answer(C, sequence, sequence); return; } int len = sequence.size(); while((1 << lg(len)) != len) { sequence.push_back(-1); swap(sequence[sequence.size() - 2], sequence[sequence.size() - 1]); len++; } len = sequence.size(); int layers = lg(len); vector<int> X, Y; X.resize((1 << layers) - 1); Y.resize((1 << layers) - 1); for(int i=0; i<(1 << layers) - 1; i++) { if(2*i+1 < (1<<layers) - 1) X[i] = -(2*i+1 + 1); if(2*i+2 < (1<<layers) - 1) Y[i] = -(2*i+2 + 1); } for(int i=0; i<len; i++) { int cp = 0; string str; for(int j=0; j<lg(len)-1; j++) { if(i & (1<<j)) { cp = cp * 2 + 2; str += "Y"; } else { cp = cp * 2 + 1; str += "X"; } } if(i & (1 << (lg(len) - 1))) { str += "Y"; Y[cp] = sequence[i]; } else { str += "X"; X[cp] = sequence[i]; } //cout << cp << " " << str << "\n"; } 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...