Submission #74905

#TimeUsernameProblemLanguageResultExecution timeMemory
74905khsoo01Mechanical Doll (IOI18_doll)C++14
100 / 100
140 ms9348 KiB
#include "doll.h" #include<bits/stdc++.h> using namespace std; const int N = 200005, G = 18; int n, m, g, cc = 1; bool on[G]; vector<int> c, x, y, a[G]; int rev (int I, int S) { int R = 0; for(int i=1;i<S;i*=2) { if(I & i) R += S/2/i; } return R; } void create_circuit (int M, vector<int> A) { n = A.size(); m = M; for(int i=1;i-1<n;i*=2) { g++; } for(int i=0;i<g;i++) { if(n & (1<<(g-i-1))) on[i] = true; } for(int i=1,j=0;i<=(1<<g)-1;i++) { int T = i ^ (i-1); for(int i=g;i--;) { if(T & (1<<i)) { T = i; break; } } if(!on[T]) continue; a[T].push_back(A[j++]); } for(int i=0;i<=m;i++) { c.push_back(-1); } for(int i=0;i<g;i++) { if(i == g-1) { if(on[i]) x.push_back(a[i][0]); else x.push_back(-1); y.push_back(0); } else if(!on[i]) { x.push_back(-1); y.push_back(-(cc+1)); cc += 1; } else { int S = (1<<(g-i-1)); x.push_back(-(cc+1)); y.push_back(-(cc+S)); for(int j=1;j<S;j++) { if(j < S/2) { x.push_back(-(cc+2*j)); y.push_back(-(cc+2*j+1)); } else { x.push_back(a[i][rev(2*(j-S/2), S)]); y.push_back(a[i][rev(2*(j-S/2)+1, S)]); } } cc += S; } } 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...