제출 #500012

#제출 시각아이디문제언어결과실행 시간메모리
500012sidon자동 인형 (IOI18_doll)C++17
0 / 100
3 ms4556 KiB
#include <bits/stdc++.h>
using namespace std;
#include "doll.h"

vector<int> s, x(1<<18), y(1<<18), a;
int cnt, v, b, ind, rt;

int next() {
	int j = 0;
	for(int k = 0; k < b; k++)
		if(v & (1<<k)) j |= 1<<(b-k-1);
	s[j+=ind] = -rt-1, ++v;
	return j;
}

int dfs(int l, int r, int u) {
	if(r - l  > 2) {
		int m = (l + r) / 2;
		x[u] = -1-dfs(l, m, cnt++);
		y[u] = -1-dfs(m, r, cnt++);
	} else {
		x[u] = a[next()];
		y[u] = a[next()];
	}
	return u;
}

void create_circuit(int M, vector<int> A) {
	int N = A.size();
	s.resize(M+1), a = A;

	for(b = 0; b < 20; b++){
		if(N & (1<<b)){
			s[rt] = -cnt++-1;
			rt = cnt-1, v = 0;

			dfs(0, 1<<b, rt);
			rt = a[(ind+=1<<b)-1];
		}
	}
	s[rt] = 0;
	x.resize(cnt);
	y.resize(cnt);

	answer(s, 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...