Submission #704031

#TimeUsernameProblemLanguageResultExecution timeMemory
704031SamNguyenUnscrambling a Messy Bug (IOI16_messy)C++14
49 / 100
1 ms304 KiB
#include <vector>
#include "messy.h"
#include <bits/stdc++.h>
using namespace std;

namespace subtask_1 {
	const int N = 8, W = 256, R = 256;
	vector<int> perm;

	string get_str(int l, int r) {
		int m = (l + r) >> 1;
		string str(N, '0');
		fill(str.begin() + l, str.begin() + m + 1, '1');
		return str;
	}

	template <class F>
	void traverse_tree(F f, int l = 0, int r = N - 1) {
		if (l == r)
			return;
		
		bool ok = f(l, r);
		if (not ok)
			return;

		int m = (l + r) >> 1;
		traverse_tree(f, l, m);
		traverse_tree(f, m + 1, r);
	}

	void add_elements() {
		traverse_tree([&](int l, int r) {
			add_element(get_str(l, r));
			return true;
		});
	}

	void check_elements() {
		vector<int> inds;

		traverse_tree([&](int l, int r) {
			string str = get_str(l, r);
			int m = (l + r) >> 1;

			for (int i = l; i <= m; i++)
			for (int j = m + 1; j <= r; j++) {
				swap(str[i], str[j]);
				if (check_element(str)) {
					inds = {i, j};
					return false;
				}
				swap(str[i], str[j]);
			}

			return true;
		});

		perm.resize(N);
		iota(perm.begin(), perm.end(), 0);

		if (not inds.empty()) 
			swap(perm[inds.front()], perm[inds.back()]);

		return;
	}

	vector<int> restore_permutation() {
		add_elements();
		compile_set();
		check_elements();

		return perm;
	}
};

namespace subtask_2 {
	int N, W, R;
	vector<int> perm, inds;

	void add_elements() {
		inds.resize(N);
		iota(inds.begin(), inds.end(), 0);
		shuffle(inds.begin(), inds.end(), mt19937(0));

		string tmp(N, '0');
		for (int i : inds) {
			tmp[i] = '1';
			add_element(tmp);
		}
	}

	void check_elements() {
		perm.resize(N);

		string tmp(N, '0');
		for (int i : inds) {
			for (int x : inds) if (tmp[x] == '0') {
				tmp[x] ^= 1;
				if (check_element(tmp)) {
					perm[x] = i;
					//cout << "perm[" << x << "] = " << i << endl;
					break;
				}
				tmp[x] ^= 1;
			}
		}
	}

	vector<int> restore_permutation(int n, int w, int r) {
		N = n, W = w, R = r;
		
		add_elements();
		compile_set();
		check_elements();

		return perm;
	}
};

namespace subtask_full {
	vector<int> perm;

	void add_elements() {
	}

	void check_elements() {
	}

	vector<int> restore_permutation(int n, int w, int r) {
		return perm;
	}
};

vector<int> restore_permutation(int n, int w, int r) {
	/*
    if (n == 8 and w == 256 and r == 256)
		return subtask_1::restore_permutation();
	*/
    //if (n == 32)
		return subtask_2::restore_permutation(n, w, r);

	return subtask_full::restore_permutation(n, w, r);
}
#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...