답안 #1048346

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1048346 2024-08-08T06:57:14 Z Alihan_8 자동 인형 (IOI18_doll) C++17
10 / 100
1 ms 348 KB
#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 / 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 f = [&](int v){
		return v - (1 << (lg + 1)) + 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
			bool nxt = false;
			
			if ( state[v] > 0 ){
				X[v - 1] = (p < n && f(v * 2) < n ? A[p] : -1);
				nxt = X[v - 1] != -1;
			} else{
				Y[v - 1] = (p < n && f(v * 2 + 1) < n ? A[p] : -1);
				nxt = Y[v - 1] != -1;
			}
			
			dfs(dfs, 1, p + nxt);
			
			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);
	
	{ // compressing 
		vector <int> good(ct + 1);
		
		auto dfs = [&](auto dfs, int v) -> int{
			auto &x = good[v];
			
			if ( L[v] == -1 ){ // leaf
				return x = (X[v - 1] != -1 || Y[v - 1] != -1);
			}
			
			x = dfs(dfs, L[v]) | dfs(dfs, R[v]);
			
			return x;
		};
		
		dfs(dfs, 1);
		
		int cnt = 0;
		
		map <int,int> id;
		
		vector <int> x, y;
		
		auto get = [&](int u){
			if ( !id.count(u) ){
				id[u] = ++cnt;
				x.pb(0), y.pb(0);
			} return id[u];
		};
		
		auto trav = [&](auto trav, int v) -> int{
			int u = get(v);
			
			if ( L[v] == -1 ){ // leaf
				x[u - 1] = X[v - 1];
				y[u - 1] = Y[v - 1];
			} else{
				if ( good[L[v]] ){
					x[u - 1] = -get(L[v]);
				} else x[u - 1] = -1;
				
				if ( good[R[v]] ){
					y[u - 1] = -get(R[v]);
				} else y[u - 1] = -1;
				
				for ( auto j: {L[v], R[v]} ){
					if ( good[j] ) trav(trav, j);
				}
			}
			
			return u;
		};
		
		trav(trav, 1);
		
		answer(C, x, y);
	}
}
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 344 KB wrong motion
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 344 KB wrong motion
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 344 KB wrong motion
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 348 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 0 ms 348 KB Output is correct
8 Correct 0 ms 348 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 344 KB wrong motion
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 344 KB wrong motion
2 Halted 0 ms 0 KB -