제출 #1362781

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

void recal(vector<int> &p){
	vector<pair<int, int>> v;
	for(int i = 0;i<p.size();i++) v.push_back({p[i], i});
	sort(v.begin(), v.end());
	for(int i = 0;i<v.size();i++) p[v[i].second] = i;
}

vector<int> construct_permutation(ll k){
	vector<int> ans, b;
	while(k) b.push_back(k & 3), k /= 4;
	if(b.back() == 2) ans.push_back(0);
	else if(b.back() == 3) ans.push_back(1), ans.push_back(0);
	for(int i = (int)b.size() - 2;i>=0;i--){
		if(b[i] == 0) ans.push_back(1e9), ans.push_back(2e9);
		else if(b[i] == 1) ans.push_back(1e9), ans.push_back(1e9 + 1), ans.push_back(-1);
		else if(b[i] == 2) ans.push_back(1e9), ans.push_back(-1), ans.push_back(2e9);
		else{
			int p0, p1;
			for(int j = 0;j<ans.size();j++){
				if(ans[j] == 0) p0 = j;
				else if(ans[j] == 1) p1 = j;
			}
			if(p1 < p0){
				for(int j = 0;j<ans.size();j++) if(ans[j] <= 1) --ans[j];
				ans.push_back(1e9);
				ans.push_back(2e9);
				ans.push_back(1);
			}else{
				ans.push_back(1e9);
				ans.push_back(-1);
				ans.push_back(2e9);
				ans.push_back(-2);
			}
		}
		recal(ans);
	}
	return ans;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…