# | Submission time | Handle | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1094457 | 2024-09-29T16:27:39 Z | Math4Life2020 | Mechanical Doll (IOI18_doll) | C++17 | 0 ms | 0 KB |
//#include 'doll.h' #include <bits/stdc++.h> using namespace std; using pii = pair<int,int>; const int INF = 1e9; int v2(int x) { return __builtin_ctz(x); } int l2(int x) { return (31-__builtin_clz(x)); } void create_circuit(int M, vector<int> A) { int N = A.size(); vector<int> C; C.push_back(A[0]); for (int i=0;i<M;i++) { C.push_back(-1); } vector<int> X,Y; int CIND = 0; int D = l2(2*N-1); stack<pii> bd; bd.push({N,D}); while (!bd.empty()) { pii p0 = bd.top(); bd.pop(); int k = p0.first; int d = p0.second; if (d==1) { if (k==1) { X.push_back(0); Y.push_back(-INF); } else if (k==2) { X.push_back(-INF); Y.push_back(-INF); } else { cout << "reporting error #1\n"; } } else { if (k>(1<<(d-1))) { Y.push_back(CIND+1); X.push_back(CIND+(1<<(d-1))); bd.push({(1<<(d-1)),d-1}); bd.push({k-(1<<(d-1)),d-1}); } else { X.push_back(0); Y.push_back(CIND+1); bd.push({k,d-1}); } } CIND++; } bool st[X.size()]; for (int t=0;t<N;t++) { st[t]=0; } for (int t=0;t<N;t++) { int cx = 0; int locp = -1; bool stp = 0; while (cx >= 0) { if (st[cx]==0) { st[cx]=1; locp = cx; stp = 0; cx = X[cx]; } else { st[cx]=0; locp = cx; stp = 1; cx = Y[cx]; } } if (cx != -INF) { cout << "invalid value\n"; } else { int nval; if (t<(N-1)) { nval = A[t+1]; } else { nval = 0; } nval++; if (stp==0) { X[locp]=-INF+1+nval; } else { Y[locp]=-INF+1+nval; } } } for (int i=0;i<N;i++) { for (int d=0;d<X.size();d++) { if (X[d]>=0) { X[d]=-1-X[d]; } else { X[d]=(-INF+1)-X[d]; } if (Y[d]>=0) { Y[d]=-1-Y[d]; } else { Y[d]=(-INF+1)-Y[d]; } } } answer(C,X,Y); }