Submission #1154778

#TimeUsernameProblemLanguageResultExecution timeMemory
1154778SharkyPermutation (APIO22_perm)C++17
0 / 100
0 ms324 KiB
#include "perm.h"
#include <bits/stdc++.h>
using namespace std;

void append(vector<int>& v, int x, bool bk = 1) {
	map<int, int> e;
	for (int& a : v) {
		if (a > x) a++;
		e[a]++;
	}
	for (int i = 0;; i++) if (!e.count(i)) {
		if (bk) v.push_back(i);
		else v.insert(v.begin(), i);
		break;
	}
}

const int big = 100000;
const int small = -1;

std::vector<int> construct_permutation(long long k) {
	vector<int> ops;
	while (k) {
		ops.push_back(k % 4);
		k /= 4;
	}
	reverse(ops.begin(), ops.end());
	vector<int> p;
	for (int i : ops) {
		if (p.empty()) {
			if (i == 1) p = {};
			else if (i == 2) p = {0};
			else if (i == 3) p = {1, 0};
		} else {
			int n = p.size();
			if (i == 0) {
				append(p, big);
				append(p, big);
			} else if (i == 1) {
				append(p, big);
				append(p, big);
				append(p, small);
			} else if (i == 2) {
				append(p, big);
				append(p, small);
				append(p, big);
			} else if (i == 3) {
				int p0 = -1, p1 = -1;
				for (int j = 0; j < n; j++) if (p[j] == 0) {
					p0 = j;
					break;
				}
				for (int j = 0; j < n; j++) if (p[j] == 1) {
					p1 = j;
					break;
				}
				bool ok = (p0 != -1 && p1 != -1 && p1 < p0);
				if (ok) {
					append(p, big);
					append(p, big);
					append(p, 1);
				} else {
					append(p, big);
					append(p, small);
					append(p, big);
					append(p, small);
				}
			}
		}
	}
	return p;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...