CF2103D.Local Construction

普及+/提高

通过率:0%

AC君温馨提醒

该题目为【codeforces】题库的题目,您提交的代码将被提交至codeforces进行远程评测,并由ACGO抓取测评结果后进行展示。由于远程测评的测评机由其他平台提供,我们无法保证该服务的稳定性,若提交后无反应,请等待一段时间后再进行重试。

题目描述

在数组 b1,b2,…,bmb_1, b_2, \ldots, b_m 中,元素 bib_i(1≤i≤m1 \le i \le m)是局部最小值当且仅当满足以下至少一个条件:

  • 2≤i≤m−12 \le i \le m - 1 且 bi<bi−1b_i < b_{i - 1} 且 bi<bi+1b_i < b_{i + 1},或
  • i=1i = 1 且 b1<b2b_1 < b_2,或
  • i=mi = m 且 bm<bm−1b_m < b_{m - 1}。

类似地,元素 bib_i(1≤i≤m1 \le i \le m)是局部最大值当且仅当满足以下至少一个条件:

  • 2≤i≤m−12 \le i \le m - 1 且 bi>bi−1b_i > b_{i - 1} 且 bi>bi+1b_i > b_{i + 1},或
  • i=1i = 1 且 b1>b2b_1 > b_2,或
  • i=mi = m 且 bm>bm−1b_m > b_{m - 1}。

注意,对于只有一个元素的数组,局部最小值和局部最大值没有定义。

给定一个隐藏的排列 ∗^{\text{∗}} pp,其长度为 nn。对该排列交替执行以下两种操作,从操作 1 开始,直到 pp 中只剩一个元素:

  • 操作 1 —— 删除 pp 中所有不是局部最小值的元素。
  • 操作 2 —— 删除 pp 中所有不是局部最大值的元素。

具体来说,在每次奇数轮迭代时执行操作 1,在每次偶数轮迭代时执行操作 2,直到 pp 中只剩一个元素。

对于每个下标 ii(1≤i≤n1 \le i \le n),设 aia_i 为元素 pip_i 被删除的轮次编号,若未被删除则设为 −1-1。

可以证明,最多经过 ⌈log⁡2n⌉\lceil \log_2 n \rceil 轮迭代后 pp 中只剩一个元素(即 ai≤⌈log⁡2n⌉a_i \le \lceil \log_2 n \rceil)。

给定数组 a1,a2,…,ana_1, a_2, \ldots, a_n,你的任务是构造任意一个满足数组 aa 的排列 pp。

∗^{\text{∗}} 长度为 nn 的排列是指由 11 到 nn 的 nn 个不同整数按任意顺序组成的数组。例如,[2,3,1,5,4][2,3,1,5,4] 是一个排列,但 [1,2,2][1,2,2] 不是(因为 22 出现了两次),[1,3,4][1,3,4] 也不是(因为 n=3n=3 但出现了 44)。

输入格式

每个测试包含多个测试用例。第一行输入测试用例数量 tt(1≤t≤1041 \le t \le 10^4)。接下来是各测试用例的描述。

每个测试用例的第一行包含一个整数 nn(2≤n≤2⋅1052 \le n \le 2 \cdot 10^5)——排列 pp 的长度。

每个测试用例的第二行包含 nn 个整数 a1,a2,…,ana_1, a_2, \ldots, a_n(1≤ai≤⌈log⁡2n⌉1 \le a_i \le \lceil \log_2 n \rceil 或 ai=−1a_i = -1)——元素 pip_i 被删除的轮次编号。

保证所有测试用例的 nn 之和不超过 2⋅1052 \cdot 10^5。

保证至少存在一个满足数组 aa 的排列 pp。

输出格式

对于每个测试用例,输出 nn 个整数,表示满足数组 aa 的排列。

如果有多个解,输出任意一个即可。

输入输出样例

  • 输入#1

    7
    3
    1 1 -1
    5
    1 -1 1 2 1
    8
    3 1 2 1 -1 1 1 2
    7
    1 1 1 -1 1 1 1
    5
    1 1 1 1 -1
    5
    -1 1 1 1 1
    5
    -1 1 2 1 2

    输出#1

    3 2 1
    4 3 5 1 2
    6 7 2 4 3 8 5 1
    6 5 2 1 3 4 7
    5 4 3 2 1
    1 2 3 4 5
    4 5 2 3 1

说明/提示

在第一个测试用例中,对排列 [3,2,1][3, 2, 1] 执行的操作如下:

  1. [3,2,1][3, 2, 1] 的唯一局部最小值是 11,因此删除 33 和 22。此时只剩一个元素,过程终止。
    这满足数组 a=[1,1,−1]a = [1, 1, -1],因为 p1p_1 和 p2p_2 在第 1 轮被删除,而 p3p_3 未被删除。

在第二个测试用例中,对排列 [4,3,5,1,2][4, 3, 5, 1, 2] 执行的操作如下:

  1. [4,3,5,1,2][4, 3, 5, 1, 2] 的局部最小值是 33 和 11,因此删除 44、55 和 22。
  2. [3,1][3, 1] 的唯一局部最大值是 33,因此删除 11。此时只剩一个元素,过程终止。
    这满足数组 a=[1,−1,1,2,1]a = [1, -1, 1, 2, 1],因为 p1p_1、p3p_3 和 p5p_5 在第 1 轮被删除,p4p_4 在第 2 轮被删除,p2p_2 未被删除。

在第三个测试用例中,对排列 [6,7,2,4,3,8,5,1][6, 7, 2, 4, 3, 8, 5, 1] 执行的操作如下:

  1. 局部最小值是 66、22、33 和 11,因此删除 77、44、88 和 55。
  2. 局部最大值是 66 和 33,因此删除 22 和 11。
  3. 局部最小值是 33,因此删除 66。此时只剩一个元素,过程终止。

在第四个测试用例中,一个满足条件的排列是 [6,5,2,1,3,4,7][6, 5, 2, 1, 3, 4, 7]。11 是唯一的局部最小值,因此它会在第一轮后保留。注意,其他排列也可能满足条件,例如 [6,4,3,1,2,5,7][6, 4, 3, 1, 2, 5, 7] 也是正确的解。

翻译由 DeepSeek V3 完成

输入解题思路,AI测评打分。不知道怎么写?

首页