1 条题解
-
0
将左括号看作 ,右括号看作 。
先尝试判定。我们可以通过再次反转区间 来将 还原为 ,此时 的前缀和(记作 )将变为:
$$S_i=\begin{cases} S'_i & \text{if }i<l\\ 2S'_{l-1}-S'_i & \text{if }l\le i\le r\\ S'_i-2(S'_r-S'_{l-1}) & \text{if }r<i \end{cases}$$因为 合法当且仅当 的前缀和均非负且 ,于是 时的 可以改写为 而不影响充要性。于是限制只有四条:
- 对 ,;
- 对 ,;
- 对 ,;
- ,即 。
那么判定一个 是否合法就只需要判定是否存在 使得 满足上述条件即可。
感觉上第一条和第三条限制是比较好处理的,所以接下来我们将直接讨论 与 内是否存在负数。
两者内部都不存在负数
那么这等价于 已经是一个合法括号串了,取 为空集即可。
计数是平凡的。
其中一者存在负数
不妨假设是 中存在负数,另一种情况可以简单的翻转并反转 来计数。
设首次出现负数的位置为 ,那么必须有 ,且由于 非负,我们只需考虑第二、四条限制。
同时因为 且存在 ,所以 ,因此 。
于是若 ,根据介值定理,我们一定能在 内找到一个符合条件的 ,取 为 中 的最大值即可保证满足第二条限制;否则若 不是最大值,取一个更大值 后 内一定也会存在一个符合条件的 ,因此第二条限制也更容易满足。
这就总结出我们的策略:一定是找到 中最大的那个 ,再往后找到第一个 ,校验 中的 是否都满足 即可。
枚举 ,左半部分的计数是简单的,只需要记录一下最大前缀和。而 要么在 之前要么在 之后,如果它在 之前,就只需要 ;如果它在 之后,就要求 ,即 $S'_{p+1\dots r}-S'_N\le 2(S'_{l-1}-\frac{1}{2}S'_N)$,并且 ,于是枚举 后从后往前 dp,状态里记录一下有没有找到 即可。
两者内部都存在负数
找到第一个 出现的位置 和最后一个 出现的位置 。如果 ,那么同时有 和 ,矛盾,因此必然有 。第一、三条限制等价于 。
欸你发现简单地将 中的最大值作为 行不通了,因为可能找不到对应的 ,但是可以发现如果此时找不到 就说明 ,此时反过来取 为 中的最大值就有 ,于是可以找到对应的 。所以正着做一遍反着做一遍,然后减掉 $\max S'_{0\dots p-1}+\frac{1}{2}S'_N=\max S'_{q+1\dots N}$ 时算重的部分即可。
剩下的部分就和上一个情况类似了,同样枚举 ,右半部分新增一个阶段来记录有没有找到 即可。
总时间复杂度 。代码可以去翻我的 atc 提交记录。
- 1
信息
- ID
- 8423
- 时间
- 5000ms
- 内存
- 1024MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者