CFCF2146C.Wrong Binary Search

普及-

通过率:0%

AC君温馨提醒

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

题目描述

给定一个整数 nn 和一个长度为 nn 的二进制字符串 ss

对于长度为 nn 的排列 pp 和整数 xx,我们按照如下伪代码定义 find(x)\text{find}(x)

function find(int x):
    l := 1
    r := n
    while l <= r:
        let m be a random integer between l and r (inclusive)
        if p[m] == x
            return m
        if p[m] > x:
            r := m - 1
        else:
            l := m + 1
    return undefined     // not found

我们称整数 xx1xn1 \le x \le n)是 稳定 的,当且仅当无论在上述伪代码中每次如何选择 mmfind(x)\text{find}(x) 总是不为 undefined 且始终有 pfind(x)=xp_{\text{find}(x)}=x 成立。

你需要构造一个长度为 nn 的排列 pp,使得:

  • 对于每个 1in1 \le i \le n,当且仅当 si=1s_i=\mathtt{1} 时,整数 ii 是稳定的。

或者判断不存在这样的排列。

^{\text{∗}} 二进制字符串是指仅包含字符 0\mathtt{0}1\mathtt{1} 的字符串。

^{\text{†}} 长度为 nn 的排列是由 11nnnn 个互不相同的整数组成的序列。例如,[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)。

输入格式

每个测试点包含若干测试用例。第一行包含测试用例数 tt1t1041 \le t \le 10^4)。测试用例的描述如下。

每个测试用例的第一行包含一个整数 nn2n21052 \le n \le 2\cdot 10^5),表示排列的长度。

第二行包含一个长度为 nn 的二进制字符串 sssi=0s_i=\mathtt{0}si=1s_i=\mathtt{1})。

保证所有测试用例中 nn 的总和不超过 21052\cdot 10^5

输出格式

对于每个测试用例:

  • 如果不存在这样的排列,输出一行 "NO"。
  • 否则,第一行输出 "YES"。然后在第二行输出 nn 个不同的整数 p1,p2,,pnp_1, p_2, \ldots, p_n1pin1\le p_i\le n),表示你构造的排列。

输出中的单词大小写不敏感。例如,"yEs"、"yes"、"Yes"、"YES" 都被认为是肯定的输出。

如果有多组满足条件的答案,可以输出任意一种。

输入输出样例

  • 输入#1

    6
    3
    111
    5
    00000
    5
    10100
    7
    0010000
    11
    00001001100
    12
    011100010000

    输出#1

    YES
    1 2 3 
    YES
    2 4 3 5 1
    NO
    YES
    2 1 3 5 7 6 4
    YES
    2 1 4 3 5 7 6 8 9 11 10
    NO

说明/提示

在第一个测试用例中,可以构造 p=[1,2,3]p=[1,2,3]。以 find(2)\text{find(2)} 为例:

  • 首先,l=1l=1r=3r=3
  • 随机选择 l=1l=1r=3r=3 之间的 mm
    • 如果选择 m=1m=1
      • p1=1<2p_1=1<2,所以 ll 更新为 m+1=2m+1=2,现在 l=2l=2, r=3r=3
      • 随机在 l=2l=2r=3r=3 之间选择 mm
      • 如果选择 m=2m=2p2=2p_2=2,直接返回 22
      • 如果选择 m=3m=3p3=3>2p_3=3>2rr 更新为 m1=2m-1=2,此时 l=2l=2r=2r=2,只能选择 m=2m=2p2=2p_2=2,返回 22
    • 如果选择 m=2m=2
      • p2=2p_2=2,直接返回 22
    • 如果选择 m=3m=3,过程与 m=1m=1 类似,最终总是返回 22
  • 所以,无论过程中如何选择 mmfind(2)\text{find}(2) 的返回值始终是 22

因此,pfind(2)=p2=2p_{\text{find}(2)}=p_2=2 始终成立,整数 22 是稳定的。

同理,可以证明 1133 也是稳定的。因此,p=[1,2,3]p = [1,2,3] 是一个合法答案。

在第二个测试用例中,可以构造 p=[2,4,3,5,1]p=[2,4,3,5,1]。以 find(3)\text{find}(3) 为例:

  • 首先,l=1,r=5l=1,r=5
  • 随机选择 l=1l=1r=5r=5mm,假设选择 m=2m=2
  • p2=4>3p_2=4>3,所以 rr 变为 m1=1m-1=1,此时 l=1,r=1l=1,r=1
  • 随机选择 l=1l=1r=1r=1mm,只能选 m=1m=1
  • p1=2<3p_1=2<3ll 变为 m+1=2m+1=2,现在 l=2,r=1l=2,r=1
  • 由于 l>rl>r,循环结束,返回 undefined。

所以,find(3)\text{find}(3) 的返回值为 undefined,整数 33 不是稳定的。

同理可以分析 11224455 也都不是稳定的。因此,p=[2,4,3,5,1]p = [2,4,3,5,1] 是一个合法解。

其它排列比如 [5,4,3,2,1][5,4,3,2,1][3,5,1,4,2][3,5,1,4,2] 也都是合法的答案,你可以输出任何一个。

在第三个测试用例中,可以证明不存在这样的排列。

首页