제출 #414203

#제출 시각아이디문제언어결과실행 시간메모리
414203sofapuden자동 인형 (IOI18_doll)C++14
0 / 100
1 ms204 KiB
#include "doll.h"
#include<bits/stdc++.h>

using namespace std;

vector<int> X, Y;

int oriN;

void fin(int x, int n, int par, bool ok, int val, vector<int> &A, bool flag){
	if((x|val) >= n){
		if(ok)X[par] = A[x];
		else Y[par] = A[x];
	}
	else{
		int no = X.size();
		if(!flag){
			if(ok)X[par] = -no-1;
			else Y[par] = -no-1;
		}
		X.push_back(0);
		Y.push_back(0);
		fin(x,n,no,1,val<<1,A,0);
		fin(x|val,n,no,0,val<<1,A,0);
	}
}

void create_circuit(int m, vector<int> A) {
	A.push_back(-1);
	int n = A.size();
	oriN = n-1;
	while((int)A.size() < (1<<(int)ceil(log2(n)))){
		A.push_back(-1);
	}
	A.back() = 0;
	n = A.size();
	
	vector<int> C(m + 1,-1);
	vector<int> H(m + 1);
	
	fin(0,n,-1,0,1,A,1);
	
	vector<int> nX, nY;
	set<int> bad;
	for(int i = X.size()-1; i>=0; --i){
		if(bad.count(X[i]))X[i] = X[X[i]];
		if(bad.count(Y[i]))Y[i] = Y[Y[i]];
		if(X[i] == Y[i]){
			bad.insert(i);
		}
	}
	vector<int> se;
	for(int i = 0; i < (int)X.size(); ++i){
		if(bad.count(i))continue;
		se.push_back(i+1);
		nX.push_back(X[i]);
		nY.push_back(Y[i]);
	}
	vector<int> trans(X.size()+5,0);
	for(int i = 0; i < (int)se.size(); ++i){
		trans[se[i]] = i+1;
	}
	for(int i : nX)i = trans[i];
	for(int i : nY)i = trans[i];
	
	answer(C, nX, nY);
}
#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...