Submission #405692

#TimeUsernameProblemLanguageResultExecution timeMemory
405692rainboyUnscrambling a Messy Bug (IOI16_messy)C11
100 / 100
6 ms2196 KiB
#include "messy_c.h"
#include <string.h>

#define N	128

char cc[N + 1]; int pp[N];

void write(int l, int r) {
	int m, i;

	if (r - l == 1)
		return;
	m = (l + r) / 2;
	memset(cc + l, '0', (r - l) * sizeof *cc);
	for (i = l; i < m; i++)
		cc[i] = '1', add_element(cc), cc[i] = '0';
	memset(cc + m, '1', (r - m) * sizeof *cc), write(l, m);
	memset(cc + l, '1', (m - l) * sizeof *cc), write(m, r);
}

void read(int l, int r) {
	int m, i, j;

	if (r - l == 1)
		return;
	m = (l + r) / 2;
	for (i = l; i < r; i++)
		cc[pp[i]] = '0';
	i = l, j = r;
	while (i < j) {
		int x, tmp;

		cc[pp[i]] = '1', x = check_element(cc), cc[pp[i]] = '0';
		if (x)
			i++;
		else {
			j--;
			tmp = pp[i], pp[i] = pp[j], pp[j] = tmp;
		}
	}
	for (i = m; i < r; i++)
		cc[pp[i]] = '1';
	read(l, m);
	for (i = l; i < m; i++)
		cc[pp[i]] = '1';
	read(m, r);
}

void restore_permutation(int n, int w, int r, int *ii) {
	int i;

	write(0, n);
	compile_set();
	for (i = 0; i < n; i++)
		pp[i] = i;
	read(0, n);
	for (i = 0; i < n; i++)
		ii[pp[i]] = i;
}
#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...