Submission #394123

#TimeUsernameProblemLanguageResultExecution timeMemory
394123MounirUnscrambling a Messy Bug (IOI16_messy)C++14
100 / 100
4 ms484 KiB
#include <bits/stdc++.h>
#include "messy.h"
#define pb push_back
using namespace std;

int nBits;

void ajouterElements(int gauche, int droite){
	if (gauche == droite)
		return;

	int milieu = (gauche + droite)/2;
	for (int a0 = gauche; a0 <= milieu; ++a0){
		string chaine = "";
		for (int _ = 0; _ < nBits; ++_)
			chaine += '0';
		for (int ind = gauche; ind <= droite; ++ind)
			chaine[ind] = '1';
		chaine[a0] = '0';

		//cout << "ADD " << chaine << endl;

		add_element(chaine);
	}

	ajouterElements(gauche, milieu);
	ajouterElements(milieu + 1, droite);
}

vector<int> permutation;

void retrouver(int gauche, int droite, vector<int> iChiffres){
	if (gauche == droite){
		permutation[iChiffres[0]] = gauche;
		return;
	}

	vector<int> aGauche, aDroite;
	for (int ind : iChiffres){
		string chaine = "";
		for (int _ = 0; _ < nBits; ++_)
			chaine += '0';
		for (int iChiffre : iChiffres)
			chaine[iChiffre] = '1';
		chaine[ind] = '0';

	//	cout << "ASK " << chaine << " " << check_element(chaine) << endl;

		if (check_element(chaine))
			aGauche.pb(ind);
		else
			aDroite.pb(ind);
	}
/*
	cout << "SEQ " << gauche << " " << droite << endl;
	for (int e : aGauche)
		cout << e << " ";
	cout << endl;
	for (int e : aDroite)
		cout << e << " ";
	cout << endl << endl;*/

	int milieu = (gauche + droite)/2;
	retrouver(gauche, milieu, aGauche);
	retrouver(milieu + 1, droite, aDroite);
}

vector<int> restore_permutation(int n, int w, int r) {
	nBits = n;
	permutation.resize(nBits);
	for (int ind = 0; ind < nBits; ++ind)
		permutation[ind] = ind;
	ajouterElements(0, nBits - 1);
	compile_set();
	retrouver(0, nBits - 1, permutation);
	/*for (int e : permutation)
		cout << e << " ";
	cout << endl;*/
	return permutation;
}
#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...