Submission #446820

#TimeUsernameProblemLanguageResultExecution timeMemory
446820cs71107자동 인형 (IOI18_doll)C++14
100 / 100
111 ms14392 KiB
#include "doll.h" #include <bits/stdc++.h> using namespace std; const int MAXN = 2e5+10; int tree[MAXN*4]; int cal[MAXN*4]; int id[MAXN*4]; void create_circuit(int M, std::vector<int> A) { int n = (int)A.size(); vector<int> C; vector<int> X; vector<int> Y; C = vector<int> (M+1); if(n==1){ C[0] = A[0]; answer(C,X,Y); return; } int base = 1; for(;base<n;base<<=1); for(int i=base-1;i>=base-n;i--){ tree[i+base] = 1; } for(int i=base-1;i>=1;i--){ tree[i] = tree[(i<<1)]|tree[(i<<1)|1]; } vector<int> ord; int cur = 1; for(int i=0;i<base;i++){ cur = 1; while(cur<base){ if(cal[cur]){ cal[cur] = 0; cur<<=1; cur|=1; } else { cal[cur] = 1; cur<<=1; } } if(tree[cur]){ ord.push_back(cur-base); } } assert((int)ord.size()==n); int cnt = 0; for(int i=1;i<base;i++){ if(tree[i]){ cnt++; id[i] = -cnt; } } for(int i=0;i<n;i++){ if(i==n-1)id[ord[i]+base] = 0; else id[ord[i]+base] = A[i+1]; } C[0] = A[0]; for(int i=1;i<=M;i++){ C[i] = -1; } X = vector<int> (cnt); Y = vector<int> (cnt); int cidx = 0; for(int i=1;i<base;i++){ if(tree[i]){ if(tree[(i<<1)]){ X[cidx] = id[(i<<1)]; } else { X[cidx] = -1; } if(tree[(i<<1)|1]){ Y[cidx] = id[(i<<1)|1]; } else { Y[cidx] = -1; } cidx++; } } answer(C,X,Y); return; }
#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...