Submission #1095374

#TimeUsernameProblemLanguageResultExecution timeMemory
1095374idiotcomputerUnscrambling a Messy Bug (IOI16_messy)C++11
100 / 100
2 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
#include <random>
 
 
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(4,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);
	t[0] = '1';
	t[k-1] = '1';
	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;
	//cout << c2 << '\n';
	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";
	//cout << k << " " << c2 << '\n';
	vector<int> ord;
	for (int i = 0; i < k-2; 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);
			if (i == 0 && c == 0) cout <<"IN "<< t << '\n';
			break;
		}
	}
	//cout << c2 << '\n';
	for (int c : ipos){
		if (chin(ord,c)) continue;
		cl(t);
		t[c] = '1';
		t[ord[0]] = '1';
		if (!check_element(t)){ ord.pb(c); break;}
	}
	//cout << c2 << '\n';
	for (int c : ipos) if (!chin(ord,c)){ 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";*/
	//cout << k << " " << c2 << '\n';
	vector<int> res(n);
	bool vis[n];
	memset(vis,0,sizeof(vis));
	//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}; 
	//cout << k << " " << n << '\n';
	for (int i = 0; i < n; i++){
		if (chin(ord,i)) continue;
		pii cur = {k,n-1};
		int ck = 0;
		while (1){
			int cnt = -1;
			for (int j = cur.f; j <= cur.s; j++){
				if (vis[j]) continue;
				if (cnt != -1){ cnt = -2; break;}
				cnt = j;
			}
			if (cnt > -1){
				res[i] = cnt;
				vis[cnt] = 1;
				break;
			}
			cl(t);
			for (int j = 0; j <= ck; j++) t[ord[j]] = '1';
			t[i] = '1';
			if (check_element(t)) cur = {(cur.f+cur.s)/2+1, cur.s};
			else cur = {cur.f, (cur.f+cur.s)/2};
			ck++;
		}
	}
	for (int i = 0; i < k; i++) res[ord[i]] = i;
	//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...