CF568E Longest Increasing Subsequence

题目描述

注意,本题的内存限制比平常更低。 给定一个只包含正整数的数组,其中有些位置是空缺。 你有一个备选数集,可以用来填补空缺。每个备选数最多只能使用一次。 你的任务是确定如何填补这些空缺,以使形成的新数组中的最长严格递增子序列的长度最大。

输入格式

第一行包含一个整数 $n$,表示数组的长度($1 \leq n \leq 10^{5}$)。 第二行包含 $n$ 个用空格分隔的整数,表示该数组。用 $-1$ 表示空缺。非空缺处为不超过 $10^9$ 的正整数。保证序列中空缺的个数 $0 \leq k \leq 1000$。 第三行包含一个正整数 $m$,表示可用的备选数的个数($k \leq m \leq 10^5$)。 第四行包含 $m$ 个正整数,表示可用的填补数字。每个数字不超过 $10^9$,其中一些数字可能相同。

输出格式

输出 $n$ 个用空格分隔的整数,表示填补空缺后得到的新序列。如果有多组解,输出任意一组均可。

说明/提示

在第一个样例中,没有空缺,因此答案就是原始数组。 在第二个样例中,只有一种方式可以得到长度为 $3$ 的严格递增子序列。 在第三个样例中,答案“4 2”同样正确。注意只计算严格递增子序列。 在第五个样例中,答案“1 1 1 2”不正确,因为数字 $1$ 最多只能用两次。 由 ChatGPT 5 翻译