제출 #1208660

#제출 시각아이디문제언어결과실행 시간메모리
1208660k1r1t0Permutation (APIO22_perm)C++20
100 / 100
1 ms328 KiB
#include <bits/stdc++.h>

using namespace std;
using ll = long long;

void add_max(vector<int> &p) {
	int n = (int) p.size();
	p.push_back(n);
}

void add_min(vector<int> &p) {
	for (int &x : p)
		x++;
	p.push_back(0);
}

void add_third(vector<int> &p) {
	for (int &x : p)
		if (x > 1)
			x++;
	p.push_back(2);
}

bool condition(vector<int> &p) {
	if (p.size() < 2) return false;
	int pos1 = -1, pos0 = -1;
	for (int i = 0; i < (int) p.size(); i++)
		if (p[i] == 0) pos0 = i;
		else if (p[i] == 1) pos1 = i;
	return pos1 < pos0;
}

vector<int> construct_permutation(ll k) {
	int h = 0;
	while ((1ll << (h + 1)) <= k)
		h++;
	vector<int> p;
	for (int i = h - 2; i >= 0; i -= 2) {
		int val = (k >> i) & 3;
		if (val == 0) {
			add_max(p);
			add_max(p);
		} else if (val == 1) {
			add_max(p);
			add_max(p);
			add_min(p);
		} else if (val == 2) {
			add_max(p);
			add_min(p);
			add_max(p);
		} else if (val == 3) {
			if (condition(p)) {
				add_max(p);
				add_max(p);
				add_third(p);
			} else {
				add_max(p);
				add_min(p);
				add_max(p);
				add_min(p);
			}
		}
	}
	if (h % 2 != 0) {
		add_max(p);
		if (k & 1) add_min(p);
	}
	return p;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...