제출 #67778

#제출 시각아이디문제언어결과실행 시간메모리
67778gnoorUnscrambling a Messy Bug (IOI16_messy)C++17
100 / 100
3 ms540 KiB
#include <vector>
#include <string>

#include "messy.h"

using namespace std;

string tmp;

void add(int l,int r) {
	int m=(l+r)>>1;
	for (int i=l;i<m;i++) {
		tmp[i]='1';
		add_element(tmp);
		tmp[i]='0';
	}
	if (l+2==r) return;
	for (int i=m;i<r;i++) tmp[i]='1';
	add(l,m);
	for (int i=l;i<m;i++) tmp[i]='1';
	for (int i=m;i<r;i++) tmp[i]='0';
	add(m,r);
	for (int i=l;i<r;i++) tmp[i]='0';
}

vector<int> ans;

void solve(int l,int r,const vector<int> &candid,const vector<int> &pre) {
	if (l+1==r) {
		ans[candid.front()]=l;
		return;
	}
	for (auto i:pre) {
		tmp[i]='1';
	}
	vector<int> ll;
	vector<int> rr;
	for (auto i:candid) {
		tmp[i]='1';
		if (check_element(tmp)) {
			ll.push_back(i);
		} else {
			rr.push_back(i);
		}
		tmp[i]='0';
	}
	int m=(l+r)>>1;
	solve(l,m,ll,rr);
	solve(m,r,rr,ll);
	for (auto i:pre) {
		tmp[i]='0';
	}
}

std::vector<int> restore_permutation(int n, int w, int r) {
	for (int i=0;i<n;i++) {
		tmp.push_back('0');
	}
	add(0,n);
	compile_set();
	ans.resize(n);
	for (int i=0;i<n;i++) {
		tmp[i]='0';
	}
	vector<int> init(n);
	for (int i=0;i<n;i++) {
		init[i]=i;
	}
	solve(0,n,init,vector<int>());
	return ans;
}
#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...