CF1987G2.Spinning Round (Hard Version)

NOI/NOI+/CTSC

通过率:0%

AC君温馨提醒

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

题目描述

这是该问题的困难版本。两种版本的区别仅在于 ss 中允许的字符。只有当你同时解决了两个版本的问题时,才能进行 Hack。

给定一个长度为 nn 的排列 pp,以及一个长度为 nn 的字符串 ss,其中每个字符都是 L、R 或 ?。

对于每个 ii,1≤i≤n1 \le i \le n:

  • 定义 lil_i 为最大的 j<ij < i,使得 pj>pip_j > p_i。如果不存在这样的 jj,则 li:=il_i := i。
  • 定义 rir_i 为最小的 j>ij > i,使得 pj>pip_j > p_i。如果不存在这样的 jj,则 ri:=ir_i := i。

初始时,你有一个 nn 个点(编号为 11 到 nn)且没有边的无向图。然后,对于每个 ii,1≤i≤n1 \le i \le n,向图中添加一条边:

  • 如果 si=Ls_i = \text{L},则添加边 (i,li)(i, l_i)。
  • 如果 si=Rs_i = \text{R},则添加边 (i,ri)(i, r_i)。
  • 如果 si=?s_i = ?,你可以选择添加边 (i,li)(i, l_i) 或 (i,ri)(i, r_i)。

请你求出所有可能构造出的连通图中,直径的最大值。如果无法构造出任何连通图,输出 −1-1。

∗^* 设 d(s,t)d(s, t) 表示从 ss 到 tt 的任意路径上最少的边数。

图的直径定义为所有点对 (s,t)(s, t) 中 d(s,t)d(s, t) 的最大值。

输入格式

每组测试数据包含多组测试用例。输入的第一行包含一个整数 tt(1≤t≤2⋅1041 \le t \le 2 \cdot 10^4),表示测试用例的数量。每组测试用例的描述如下。

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

第二行包含 nn 个整数 p1,p2,…,pnp_1, p_2, \ldots, p_n(1≤pi≤n1 \le p_i \le n),表示排列 pp 的元素,保证 pp 是一个排列。

第三行包含一个长度为 nn 的字符串 ss,只包含字符 L、R 和 ?。

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

输出格式

对于每组测试用例,输出一个整数,表示所有可能构造出的连通图中直径的最大值。如果无法构造出任何连通图,输出 −1-1。

输入输出样例

  • 输入#1

    8
    5
    2 1 4 3 5
    R?RL?
    2
    1 2
    LR
    3
    3 1 2
    L?R
    7
    5 3 1 6 4 2 7
    ?R?R?R?
    5
    5 2 1 3 4
    ?????
    6
    6 2 3 4 5 1
    ?LLRLL
    8
    1 7 5 6 2 8 4 3
    ?R??????
    12
    6 10 7 1 8 5 12 2 11 3 4 9
    ????????????

    输出#1

    3
    -1
    -1
    4
    4
    3
    5
    8

说明/提示

在第一个测试用例中,有两个连通图(节点编号为索引):

左边的图的直径为 22,右边的图的直径为 33,所以答案为 33。

在第二个测试用例中,无法构造出任何连通图,所以答案为 −1-1。

由 ChatGPT 4.1 翻译

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

首页