제출 #1048206

#제출 시각아이디문제언어결과실행 시간메모리
1048206Alihan_8Mechanical Doll (IOI18_doll)C++17
47 / 100
95 ms14204 KiB
#include "doll.h"

#include <bits/stdc++.h>

using namespace std;

#define pb push_back
#define ln '\n'
#define all(x) x.begin(), x.end() 

template <class F, class S>
bool chmax(F &u, const S &v){
	bool flag = false;
	
	if ( u < v ){
		u = v; flag |= true;
	}
	
	return flag;
}

void create_circuit(int m, std::vector<int> A) {
	int n = A.size(), x = (n + 1) / 2;
	
	int lg = __lg(x);
	
	if ( (1 << lg) < x ) ++lg;
	
	vector <int> L(2 * n), R(2 * n);
	
	int ct = 0;
	
	auto build_tree = [&](auto build_tree, int v, int d) -> void{
		chmax(ct, v);
		
		L[v] = R[v] = -1;
		
		if ( d == 0 ) return;
		
		L[v] = v * 2, R[v] = v * 2 + 1;
		
		build_tree(build_tree, v * 2, d - 1);
		build_tree(build_tree, v * 2 + 1, d - 1);
	};
	
	build_tree(build_tree, 1, lg);
	
	vector <int> C(m + 1, -1), X(ct), Y(ct);
	
	C[0] = A[0];
	
	vector <int> state(ct + 1);
	
	auto dfs = [&](auto dfs, int v, int p) -> void{
		state[v] ^= 1;
		
		if ( v == ct && !state[v] ){ // last Vertex
			Y[v - 1] = 0; return;
		}
		
		if ( L[v] == -1 ){ // leaf vertex
			if ( state[v] > 0 ){
				X[v - 1] = (p < n ? A[p] : -1);
			} else Y[v - 1] = (p < n ? A[p] : -1);
			
			dfs(dfs, 1, p + 1);
			
			return;
		}
		
		X[v - 1] = -L[v];
		Y[v - 1] = -R[v];
		
		if ( state[v] ){
			dfs(dfs, L[v], p);
		} else dfs(dfs, R[v], p);
	};
	
	dfs(dfs, 1, 1);
	
	answer(C, X, Y); 
	
	return;
	
	for ( int i = 0; i <= m; i++ ){
		cout << i << " " << C[i] << ln;
	}
	
	for ( int i = 0; i < ct; i++ ){
		cout << -(i + 1) << ' ' << X[i] << ln;
		cout << -(i + 1) << " " << Y[i]  << ln;
	}
}
#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...