[EER1] 单调栈
题目描述
单调栈是一种常见的数据结构,如果你之前没有了解过,可以参考 [单调栈教程](https://www.luogu.com.cn/problemnew/solution/P5788) 帮助理解题意。
有一个长度为 $n$ 的**排列** $p_0, p_1, \cdots, p_{n-1}$,通过这个排列生成了一个长度为 $n$ 的序列 $S$,其中 $S_i$ 表示由 $p_0, p_1, \cdots, p_i$ 组成的递增单调栈的大小。
换一种说法,序列 $S$ 是由如下代码生成的:
```cpp
stack<int> stk;
int n = p.size();
vector<int> S;
for (int i = 0; i < n; i++) {
while (!stk.empty() && p[i] <= p[stk.top()]) stk.pop();
stk.push(i);
S.push_back((int)stk.size());
}
```
现在给你序列 $S$ 的**一部分**,没有给出的部分可以取任意值。请你根据给出的 $S$ 复原出排列 $p$。如果有多种可能,输出字典序最小的。保证一定有解。
输入输出格式
输入格式
第一行一个整数 $n$。表示排列的长度。
接下来一行 $n$ 个整数,表示序列 $S$。其中部分项为 $-1$,表示可以取任意值。
输出格式
一行 $n$ 个整数,一个排列。
输入输出样例
输入样例 #1
10
1 -1 2 3 -1 3 1 -1 2 3
输出样例 #1
2 4 3 6 7 5 1 9 8 10
输入样例 #2
10
1 1 2 2 3 2 3 3 4 5
输出样例 #2
2 1 5 4 6 3 8 7 9 10
说明
样例 #1 解释:样例 $1$ 的输出对应的 $S$ 序列为 1 2 2 3 4 3 1 2 2 3,可以匹配输入。可以证明这是字典序最小的可以匹配输入的排列。
对于 $100\%$ 的数据,满足 $1 \leq n \leq 10^6$。
本题共有 $5$ 个子任务,每个子任务的限制如下:
子任务 $1$ ($5$ 分):保证 $1 \leq n \leq 10$。
子任务 $2$ ($10$ 分):保证给出的 $S$ 中没有 $-1$。
子任务 $3$ ($20$ 分):保证 $1 \leq n \leq 300$。
子任务 $4$ ($20$ 分):保证 $1 \leq n \leq 3000$。
子任务 $5$ ($45$ 分):无特殊限制。