CF1023D.Array Restoration

传统题 时间 2000 ms 内存 256 MiB 9 尝试 4 已通过 1 标签

Array Restoration

题目描述

最初有一个包含 nn 个整数的数组 aa,其下标从 11nn

对该数组进行了恰好 qq 次操作。在第 ii 次操作中,选择了一个区间 (li,ri)(l_i, r_i)1lirin1 \le l_i \le r_i \le n),并将从 lil_irir_i(包括两端)内的所有元素的值都改为 ii。操作的顺序不能改变,所有 qq 次操作都已执行。已知数组的每个位置都至少被某个区间覆盖过一次。

我们本可以让你判断,给定一个由 nn 个整数(取值范围为 11qq)组成的数组,是否可以通过上述操作得到。但我们觉得这对你来说太简单了。

因此,我们对问题进行了如下增强:在最终数组中,选择了一些位置(可能为空),并将这些位置上的元素值设为 00

你的任务是判断,是否可以通过上述操作得到这个数组。如果可以,请还原出一个可能的原始数组。

如果存在多种可能的原始数组,输出任意一种即可。

输入格式

第一行包含两个整数 nnqq1n,q2×1051 \le n, q \le 2 \times 10^5),分别表示数组的长度和操作次数。

第二行包含 nn 个整数 a1,a2,,ana_1, a_2, \dots, a_n0aiq0 \le a_i \le q),表示最终得到的数组。如果某个位置 jj 上的元素为 00,则该位置的元素可以是 11qq 之间的任意整数。

输出格式

如果可以通过 qq 次操作得到数组 aa,输出 "YES"。

否则输出 "NO"。

如果可以得到,第二行输出 nn 个整数,第 ii 个数表示还原后的第 ii 个元素,且每个元素的值应在 11qq 之间。该数组应能通过恰好 qq 次操作得到。

如果存在多种可能的原始数组,输出任意一种即可。

说明/提示

在第一个样例中,你也可以将 00 替换为 11,但不能替换为 33

在第二个样例中,直到第 1010 次操作选择区间 (1,3)(1, 3) 之前,选择哪些区间并不重要。

第三个样例说明了操作顺序不能改变,不能先将 (1,3)(1, 3) 赋值为 66,再将 (2,2)(2, 2) 赋值为 5555 的区间必须在 66 的区间之前执行。

第四个样例有很多种正确的还原数组。

由 ChatGPT 4.1 翻译

样例

4 3
1 0 2 3
YES
1 2 2 3
3 10
10 10 10
YES
10 10 10 
5 6
6 5 6 2 2
NO
3 5
0 0 0
YES
5 4 2

在线编程 IDE

建议全屏模式获得最佳体验