20251018NOIP模拟赛

题目大意:

给你一个长度为 \(2 \times n\) 的由 \(\text{(}\)\(\text{)}\) 构成的串,再给你 \(n\) 个二元组 \(a < b\),保证所有的 \(a\)\(b\) 构成了一个长度为 \(2 \times n\) 的排列。
问能否选出一个长度为 \(n\) 的子序列,使得每个 \(a,b\) 恰好在其中出现了一个,而且这个长度为 \(n\) 的字符串是括号匹配串。
\(n \le 2 \times 10^5\)

解题思路:

首先将左括号看成 1,右括号看成 -1,那么相当于每个前缀的值 \(\ge 0\) 且恰有 \(n\)\(1,-1\)

先考虑 \(a,b\) 都是左右括号的情况,全是左括号选左边的,全是右括号选右边的。
对于一个左括号右括号的情况,我们可以使用调整法,先选右括号,那么将右括号调整成左括号相当于给两个后缀加一。
再从前往后扫一遍,每次如果当前的和为负数,那么说明一定要从前面找一个右括号调整成左括号,至于选哪个,就是选 \(b\) 最小的那个,因为前 \(1 \sim i - 1\) 中已经不需要了,将前面的某个后缀加一对于 \(i\) 来说都是一样的。
\(O(n \log n)\)

赛时的贪心可以尝试构造hack/拍来check

posted @ 2025-10-21 09:35  positive_deviation  阅读(7)  评论(0)    收藏  举报