제출 #1358978

#제출 시각아이디문제언어결과실행 시간메모리
1358978kantaponz순열 (APIO22_perm)C++20
100 / 100
4 ms344 KiB
#include "perm.h"
#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define db long double

const ll inf = 1e8;

void adjust_permutation(vector<int> &v) {
	vector<int> a = v;
	sort(a.begin(), a.end());
	a.erase(unique(a.begin(), a.end()), a.end());
	for (auto &x : v) {
		x = lower_bound(a.begin(), a.end(), x) - a.begin();
	}
}

std::vector<int> construct_permutation(long long k)
{
	vector<int> bit;
	while (k > 0) {
		bit.push_back(k % 4LL);
		k /= 4LL;
	}
	vector<int> v;
	if (bit.back() == 2) v.emplace_back(0);
	if (bit.back() == 3) v.emplace_back(1), v.emplace_back(0);
	for (int i = bit.size() - 2; i >= 0; i--) {
		if (bit[i] == 0) {
			v.emplace_back(inf);
			v.emplace_back(inf + 1);
		} else if (bit[i] == 1) {
			v.emplace_back(inf);
			v.emplace_back(inf + 1);
			v.emplace_back(-1);
		} else if (bit[i] == 2) {
			v.emplace_back(inf);
			v.emplace_back(-1);
			v.emplace_back(inf + 1);
		} else if (bit[i] == 3) {
			int p0 = 0, p1 = 1;
			for (int i = 0; i < v.size(); i++) {
				if (v[i] == 0) p0 = i;
				if (v[i] == 1) p1 = i;
			}
			if (p0 < p1) {
				v.emplace_back(inf);
				v.emplace_back(-1);
				v.emplace_back(inf + 1);
				v.emplace_back(-2);
			} else if (p0 > p1) {
				for (auto &x : v) x = (x << 1);
				v.emplace_back(inf);
				v.emplace_back(inf + 1);
				v.emplace_back(3);
			}
		}
		adjust_permutation(v);
	}

	//for (auto x : v) cout << x << " ";

	return v;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…