제출 #198384

#제출 시각아이디문제언어결과실행 시간메모리
198384DavidDamian자동 인형 (IOI18_doll)C++11
12 / 100
219 ms262148 KiB
#include "doll.h" #include<bits/stdc++.h> using namespace std; #define debug(x) cerr<<#x<<" = "<<x<<endl struct parent { int p,edge; }; vector<int> X; vector<int> Y; map<int,parent> memo; int NEXT_FREE_INDEX=1; int limit; void createTree(int i,int lv,int sum,int unused) { if(lv==limit-1){ //Last level of switches if(unused==1) X.push_back(-1); else{ X.push_back(sum); parent x={i,0}; memo[sum]=x; } sum+=(1<<lv); parent x={i,1}; Y.push_back(sum); memo[sum]=x; } else{ int child_size=(1<<(limit-lv-1)); if(unused>=child_size){ //Drop left child X.push_back(-1); Y.push_back(-NEXT_FREE_INDEX); NEXT_FREE_INDEX++; createTree(NEXT_FREE_INDEX-1,lv+1,sum+(1<<lv),unused-child_size); } else{ X.push_back(-NEXT_FREE_INDEX); NEXT_FREE_INDEX++; Y.push_back(0); createTree(NEXT_FREE_INDEX-1,lv+1,sum,unused); Y[i-1]=-NEXT_FREE_INDEX; NEXT_FREE_INDEX++; createTree(NEXT_FREE_INDEX-1,lv+1,sum+(1<<lv),0); } } } int logn[200005]; void create_circuit(int m, vector<int> A) { for(int i=2;i<=200000;i++){ logn[i]=logn[(i+1)/2]+1; } A.push_back(0); int n=A.size(); vector<int> C(m+1); for(int i=0;i<=m;i++){ C[i]=-1; } int LOG=logn[n]; NEXT_FREE_INDEX++; limit=LOG; createTree(1,0,0,(1<<LOG)-n); /*for(int i=0;i<n;i++){ cout<<X[i]<<" "<<Y[i]<<endl; }*/ int j=0; for(auto x: memo){ int p=x.second.p; int edge=x.second.edge; if(edge==0) X[p-1]=A[j]; else Y[p-1]=A[j]; j++; } memo.clear(); /*for(int i=0;i<n;i++){ cout<<X[i]<<" "<<Y[i]<<endl; }*/ 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...