Submission #514935

#TimeUsernameProblemLanguageResultExecution timeMemory
514935AdamGSMechanical Doll (IOI18_doll)C++17
100 / 100
157 ms17972 KiB
#include "doll.h" #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef long double ld; #define rep(a, b) for(int a = 0; a < (b); ++a) #define st first #define nd second #define pb push_back #define all(a) a.begin(), a.end() const int LIM=2e5+7; int lt[2*LIM], rt[2*LIM], ile[4*LIM], n, m, N=1; int kier[2*LIM], nr[2*LIM], odw[2*LIM], akt, li; int kl[2*LIM], kr[2*LIM]; vector<int>V; void usun(int v, int k) { if(v>=N) { if(k==1) lt[v]=-1; return; } if(k<=ile[2*v+1]) { lt[v]=-1; usun(2*v+1, k); } else { usun(2*v, k-ile[2*v+1]); } } void create_circuit(int M, vector<int>A) { V=A; V.pb(0); m=M; n=V.size(); while(2*N<n) N*=2; rep(i, 2*N) lt[i]=rt[i]=LIM; rep(i, N) ile[N+i]=2; for(int i=N-1; i; --i) { lt[i]=-2*i; rt[i]=-2*i-1; ile[i]=ile[2*i]+ile[2*i+1]; } usun(1, n); int p=1; while(li<n) { if(!nr[p]) { --akt; nr[p]=akt; } kier[p]^=1; if(kier[p]) { if(lt[p]==LIM) { lt[p]=V[li]; ++li; } if(lt[p]>=0) p=1; else p=-lt[p]; } else { if(rt[p]==LIM) { rt[p]=V[li]; ++li; } if(rt[p]>=0) p=1; else p=-rt[p]; } } p=1; while(p) { if(!odw[p]) { if(lt[p]>=0) kl[-nr[p]]=lt[p]; else kl[-nr[p]]=nr[-lt[p]]; if(rt[p]>=0) kr[-nr[p]]=rt[p]; else kr[-nr[p]]=nr[-rt[p]]; odw[p]=1; } kier[p]^=1; if(kier[p]) { if(lt[p]>0) p=1; else p=-lt[p]; } else { if(rt[p]>0) p=1; else p=-rt[p]; } } vector<int>C, X, Y; rep(i, m+1) C.pb(-1); for(int i=-1; i>=akt; --i) { X.pb(kl[-i]); Y.pb(kr[-i]); } 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...