제출 #1357318

#제출 시각아이디문제언어결과실행 시간메모리
1357318crispxxUnscrambling a Messy Bug (IOI16_messy)C++20
0 / 100
1 ms344 KiB
#include <vector>

#include "messy.h"

#include <bits/stdc++.h>

using namespace std;

int sz;

void add(int mask) {
	string s;
	
	for(int i = 0; i < sz; i++) {
		s += (mask >> i & 1) + '0';
	}
	
	add_element(s);
}

bool check(int mask) {
	string s;
	
	for(int i = 0; i < sz; i++) {
		s += (mask >> i & 1) + '0';
	}
	
	return check_element(s);
}

int popcount(int mask) {
	return __builtin_popcount(mask);
}

std::vector<int> restore_permutation(int n, int w, int r) {
	sz = n;
	
	{
		auto dnc = [&](auto &&self, vector<int> a) -> void {
			if(a.size() == 1) return;
			
			vector<int> a1, a2;
			
			int mask = 0;
			
			for(int i = 0; i < (int)a.size(); i++) {
				if(i & 1) {
					mask |= (1 << i);
					a1.push_back(i);
				} else {
					a2.push_back(i);
				}
			}
			
			add(mask);
			
			self(self, a1);
			
			self(self, a2);
		};
		
		vector<int> a(n);
		
		iota(a.begin(), a.end(), 0);
		
		dnc(dnc, a);
	}
	
	compile_set();
	
	set<int> st;
	
	for(int mask = 0; mask < (1 << n); mask++) {
		if(check(mask)) st.emplace(mask);
	}
	
	vector<int> p(n);
	
	iota(p.begin(), p.end(), 0);
	
	auto dif = [&](int m1, int m2) {
		vector<int> ind;
		
		for(int i = 0; i < n; i++) {
			if((m1 >> i & 1) != (m2 >> i & 1)) ind.push_back(i);
		}
		
		if(ind.empty()) return;
		
		swap(p[ind[0]], p[ind[1]]);
	};
	
	int fmask = -1;
	
	{
		auto dnc = [&](auto &&self, vector<int> a) -> void {
			if(a.size() == 1) return;
			
			vector<int> a1, a2;
			
			int mask = 0;
			
			for(int i = 0; i < (int)a.size(); i++) {
				if(i & 1) {
					mask |= (1 << i);
					a1.push_back(i);
				} else {
					a2.push_back(i);
				}
			}
			
			if(st.count(mask)) {
				st.erase(mask);
				self(self, a1);
				self(self, a2);
			} else {
				fmask = mask;
			}
		};
		
		vector<int> a(n);
		
		iota(a.begin(), a.end(), 0);
		
		dnc(dnc, a);
	}
	
	if(fmask != -1) {
		for(auto mask : st) {
			if(popcount(mask) == popcount(fmask)) {
				dif(mask, fmask);
				break;
			}
		}
	}
	
	return p;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…