Submission #362884

#TimeUsernameProblemLanguageResultExecution timeMemory
362884benedict0724Mechanical Doll (IOI18_doll)C++17
100 / 100
142 ms13072 KiB
#include "doll.h" #include <queue> #include <stdio.h> int x[400002], y[400002]; void change(int M, std::vector<int> &C, std::vector<int> &X, std::vector<int> &Y, std::vector<int> A){ std::queue<int> q; A.push_back(0); int L = (int)A.size(); for(int i=0;i<=M;i++) C[i] = -1; for(int i=0;i<=400000;i++){ x[i] = 1; y[i] = 1; } int h = 0; while((1<<h) < L) h++; L = (1<<h) - L; q.push(1); int cnt = 1; for(int i=h-1;i>=0;i--){ std::queue<int> temp; int now = q.front(); q.pop(); if(i == 0 && (1&L)){ x[now] = -1; } if(i == 0) break; if((1<<i) & L){ x[now] = -1; ++cnt; y[now] = -cnt; temp.push(cnt); } else{ ++cnt; x[now] = -cnt; temp.push(cnt); ++cnt; y[now] = -cnt; temp.push(cnt); } while(!q.empty()){ int now = q.front(); q.pop(); ++cnt; x[now] = -cnt; temp.push(cnt); ++cnt; y[now] = -cnt; temp.push(cnt); } while(!temp.empty()){ int now = temp.front(); temp.pop(); q.push(now); } } std::vector<bool> visited(cnt); X.resize(cnt); Y.resize(cnt); for(int i=0;i<cnt;i++){ X[i] = x[i+1]; Y[i] = y[i+1]; } for(int i=0;i<(1<<h) - L;i++){ int curr = -1; for(;;){ if(!visited[-curr-1]){ visited[-curr-1] = true; if(x[-curr] == 1) { X[-curr-1] = A[i]; break; } else curr = x[-curr]; } else{ visited[-curr-1] = false; if(y[-curr] == 1) { Y[-curr-1] = A[i]; break; } else curr = y[-curr]; } } } } void create_circuit(int M, std::vector<int> A) { std::vector<int> C(M + 1); std::vector<int> X, Y; change(M, C, X, Y, A); 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...