제출 #703755

#제출 시각아이디문제언어결과실행 시간메모리
703755SamNguyenUnscrambling a Messy Bug (IOI16_messy)C++14
20 / 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;
	const int MAX = 255;

	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;
	}
};

vector<int> restore_permutation(int n, int w, int r) {
    if (n == 8 and w == 256 and r == 256)
		return subtask_1::restore_permutation();
	return vector<int>();
}
#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...