# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
987606 | Otalp | 순열 (APIO22_perm) | C++17 | 49 ms | 856 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "perm.h"
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
ll pref[200][200], suf[200][200];
ll a[200100];
ll n;
void calc(){
for(int x=0; x<=n + 1; x++) pref[0][x] = 1;
for(int i=1; i<=n; i++){
for(int x=0; x<=n + 1; x++){
pref[i][x] = pref[i - 1][x];
if(a[i] <= x){
pref[i][x] += pref[i-1][a[i]];
}
}
}
for(int x=0; x<=n + 1; x++) suf[n + 1][x] = 1;
for(int i=n; i>=1; i--){
for(int x=n + 1; x>=0; x--){
suf[i][x] = suf[i + 1][x];
if(a[i] >= x){
suf[i][x] += suf[i + 1][a[i]];
}
}
}
}
vector<int> construct_permutation(ll k){
n = 1;
a[1] = 1;
calc();
ll g = pref[n][n];
while(g != k){
ll d = 0;
ll pos, x;
for(int i=1; i<=n + 1; i++){
for(int j=1; j<=n+1; j++){
ll h = pref[i - 1][j - 1] * suf[i][j];
//cout<<i<<' '<<j<<'\n';
//cout<<h<<'\n';
if(h > d and h <= k - g){
d = h;
x = j;
pos = i;
}
}
}
//cout<<g<<' '<<pos<<' '<<x<<'\n';
vector<int> q;
for(int i=1; i<pos; i++){
q.pb(a[i] + (a[i] >= x));
}
q.pb(x);
for(int i=pos; i<=n; i++){
q.pb(a[i] + (a[i] >= x));
}
n ++;
for(int i=1; i<=n; i++){
a[i] = q[i - 1];
}
calc();
g = pref[n][n];
}
vector<int> res;
for(int i=1; i<=n; i++) res.pb(a[i]-1);
//for(int d: res) cout<<d<<' ';
//cout<<'\n';
return res;
}
컴파일 시 표준 에러 (stderr) 메시지
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |