题目描述
一个长度为n的序列 A A A描述一个长度为n的排列, A i A_i Ai表示前i-1位有多少比它大的数,求出此序列A
思路
数据
n
⩽
8000
n\ \leqslant 8000
n ⩽8000
O
(
n
2
)
O(n^2)
O(n2)能过👍
从后往前推,每遇到一个数就代表它在全排列中第
A
i
A_i
Ai大
然后将全排列中未填的数第
A
i
A_i
Ai大的数塞进去再往前推
代码
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int Bol[10250], A[10250], F[10250];
int n;
int init(int k)
{
int num = 0;
for(int i = n; i >= 1; --i)
{
if(!Bol[i])num++;
if(num == k)return i;
}
}
int main()
{
scanf("%d", &n);
for(int i = 1; i <= n; ++i)
scanf("%d", &A[i]);
for(int i = n; i >= 1; --i)
{
F[i] = init(A[i] + 1);
Bol[F[i]] = 1;
}
for(int i = 1; i <= n; ++i)
printf("%d ", F[i]);
return 0;
}