제출 #1274823

#제출 시각아이디문제언어결과실행 시간메모리
1274823nicolo_010자동 인형 (IOI18_doll)C++20
100 / 100
37 ms8284 KiB
#include <bits/stdc++.h>
#include "doll.h"
using namespace std;
using ll = long long;
using pii = pair<int, int>;

int gen(vector<int> &after, vector<int> &X, vector<int> &Y, int &S) {
	int sz = after.size();
	if (sz == 0) {
		return 0;
	}
	if (sz == 1) {
		return after[0];
	}
	else {
		int b = 0;
		while ((1<<b) < sz) {
			b++;
		}
		int pw = (1<<b);
		vector<int> bits(pw), go(pw);
		for (int i=0; i<pw; i++) {
			bits[i] = (bits[i/2])/2 | ((i&1) << (b-1));
		}

		int id = --S;
		for (int i=0; i<b-1; i++) {
			for (int j=0; j<(1<<i); j++) {
				if ((j << (b-i)) + (1 << (b-i)) <= (pw-sz)) {
					;
				}
				else if ((j << (b-i)) + (1 << (b-i-1)) <= (pw-sz)) {
					X.push_back(id);
					Y.push_back(--S);
				}
				else {
					X.push_back(--S);
					Y.push_back(--S);
				}
			}
		}
		int j=0;
		for (int i=0; i<pw; i++) {
			if (bits[i] < (pw-sz)) {
				;
			}
			else {
				go[bits[i]] = after[j++];
			}
		}
		for (int i=0; i<pw/2; i++) {
			if (2*i + 2 <= (pw-sz)) {
				;
			}
			else if (2*i+1 <= (pw-sz)) {
				X.push_back(id);
				Y.push_back(go[2*i+1]);
			}
			else {
				X.push_back(go[2*i]);
				Y.push_back(go[2*i+1]);
			}
		}
		return id;
	}
}

void create_circuit(int M, std::vector<int> A) {
	A.push_back(0);
	int N = A.size();
	vector<int> C(M+1);
	vector<int> X, Y;
	int S=0;
	for (int i=0; i<N; i++) {
		;
	}
	int id = gen(A, X, Y, S);
	for (int i=0; i<M+1; i++) {
		C[i] = id;
	}
	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...