Submission #1095365

#TimeUsernameProblemLanguageResultExecution timeMemory
1095365idiotcomputerUnscrambling a Messy Bug (IOI16_messy)C++11
0 / 100
1 ms604 KiB
#include "messy.h"
#include <bits/stdc++.h>
using namespace std;
#define sz(x) (int) (x).size()
#define pii pair<int,int>
#define f first
#define s second
#define pb push_back

void cl(string &t){
	for (int i = 0; i < sz(t); i++) t[i] = '0';
}

bool chin(vector<int> &a, int v){
	for (int c : a) if (c == v) return 1;
	return 0;
}
vector<int> restore_permutation(int n, int w, int r){
	int k = 0;
	int c = 1;
	while (c < n){
		c *= 2;
		k++;
	}
	k = max(3,k);

	string t = "";
	for (int i = 0; i < n; i++) t += '0';
	for (int i = 0; i < k; i++){
		cl(t);
		t[i] = '1';
		add_element(t);
		for (int j = 0; j < i; j++) t[j] = '1';
		add_element(t);
	}
	cl(t);
	add_element(t);
	vector<pii> ranges;
	vector<pii> nex;
	ranges.pb((pii){k,n-1});
	int mid;
	for (int i = 0; i < k; i++){
		nex.clear();
		//cout << i << ": \n";
		for (pii c : ranges){
			if (c.f == c.s) continue;
			mid = (c.s + c.f)/2;
			nex.pb((pii) {c.f,mid});
			nex.pb((pii) {mid+1,c.s});
			//cout << c.f << " " << c.s << "\n";
			for (int j = mid+1; j <= c.s; j++){
				cl(t);
				t[j] = '1';
				for (int i2 = 0; i2 <= i; i2++) t[i2] = '1';
				add_element(t);
			}
		}
		swap(ranges,nex);
	}
	/*cout << k << "\n";
	for (string &c : all) cout << c << "\n";
	cout << "COMPILING:\n";*/
	compile_set();
	vector<int> ipos;
	for (int i = 0; i < n; i++){
		cl(t);
		t[i] = '1';
		if (check_element(t)) ipos.pb(i);
	}	
	/*for (int c : ipos) cout << c << ' ';
	cout << "\n";*/

	vector<int> ord;
	for (int i = 0; i < k; i++){
		for (int c : ipos){
			if (chin(ord,c)) continue;
			cl(t);
			for (int ct : ipos) t[ct] = '1';
			for (int ct : ord) t[ct] = '0';
			t[c] = '0';
			//if (i == 2) cout << c << " " << t << '\n';
			if (!check_element(t)) continue;
			ord.pb(c);
			break;
		}
	}
	/*for (int c : ord) cout << c << ' ';
	cout << "\n";*/
	for (int i = 0; i < k/2; i++) swap(ord[i],ord[k-i-1]);
	/*for (int c : ord) cout << c << ' ';
	cout << "\n";*/

	vector<int> res(n);
	pii range[n];
	for (int i = 0; i < n; i++) range[i] = {k,n-1};
	for (int i = 0; i < k; i++) range[ord[i]] = {i,i}; 
	for (int i = 0; i < k; i++){
		for (int j = 0; j < n; j++){
			if (range[i].f == range[i].s) continue;
 			cl(t);
			for (int i2 = 0; i2 <= i; i2++) t[ord[i2]] = '1';
			t[j] = '1';
			if (check_element(t)) range[i] = {(range[i].f+range[i].s)/2+1,range[i].s};
			else range[i] = {range[i].f, (range[i].f+range[i].s)/2};
		}
	}

	for (int i = 0; i < n; i++) res[i] = range[i].f;
	return res;
}


#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...