제출 #1199231

#제출 시각아이디문제언어결과실행 시간메모리
1199231Gr1senMechanical Doll (IOI18_doll)C++20
79.38 / 100
455 ms12920 KiB
#include "doll.h" #include<algorithm> #include<iostream> #include<vector> #include<iomanip> #include<unordered_map> #include<cmath> #include<math.h> using namespace std; #define vi vector<int> #define vvi vector<vi> void print(vi &L) { cerr << "{"; for (auto i : L) cerr << i << ", "; cerr << "}" << endl; } vi X, Y; int oi(int a) { return -a-1; } int oink(int s, int k, int d) { //cerr << "oink(" << s << ", " << k << ", " << d << ")" << endl; int p = X.size(); if (k <= 0) return s; if (d <= 1) { if (k == 1) return 0; X.push_back(0); Y.push_back(0); return oi(p); } X.push_back(0); Y.push_back(0); int a = pow(2, (int)log2(k)); if (a >= k) a /= 2; //cerr << "a : " << a << endl; Y[p] = oink(s, a, d-1); X[p] = oink(s, k-a, d-1); return oi(p); } void oinkoink(vi &L, vi &K, int p, int pl, int s) { /* cerr << "oinkoink(..." << p << ", " << pl << ", " << s << ")" << endl; print(L); print(K); print(X); print(Y); //*/ if (pl >= L.size()) return; if (K[oi(p)]) { K[oi(p)] = 0; if (Y[oi(p)] == 0) { Y[oi(p)] = L[pl]; oinkoink(L, K, s, pl+1, s); return; } oinkoink(L, K, Y[oi(p)], pl, s); return; } K[oi(p)] = 1; if (X[oi(p)] == 0) { X[oi(p)] = L[pl]; oinkoink(L, K, s, pl+1, s); return; } oinkoink(L, K, X[oi(p)], pl, s); } void create_circuit(int m, vector<int> A) { int n = A.size(); A.push_back(0); vi C(m + 1, 0); X.clear(); Y.clear(); vvi L(m+1); L[0] = {A[0]}; for (int i = 0; i < n; i++) { L[A[i]].push_back(A[i+1]); } int l = 0; for (int i = 0; i < m+1; i++) { /* cerr << "iteration : " << i << endl; cerr << "C : "; print(C); cerr << "X : "; print(X); cerr << "Y : "; print(Y); //*/ if (L[i].size() == 0) continue; if (L[i].size() == 1) { C[i] = L[i][0]; continue; } int a = (int)log2(L[i].size()); int b = pow(2, a); if (b == L[i].size()) { b /= 2; a--; } X.push_back(-1); Y.push_back(-1); int p = X.size()-1; C[i] = oi(p); X[p] = oink(oi(p), L[i].size()-b, a+1); Y[p] = oink(oi(p), b, a+1); vi K(X.size(), 0); oinkoink(L[i], K, oi(p), 0, oi(p)); } /* cerr << "C : "; print(C); cerr << "X : "; print(X); cerr << "Y : "; print(Y); //*/ 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...