关于括号序列

感觉这个东西好多性质啊……

也可能是我太菜了qwq

欢迎补充喵!


下面括号序列就是一个只由 \(-1,1\) 组成的序列,可以认为 \(1\) 代表左括号,\(-1\) 代表右括号。\(a_1 \sim a_n\) 表示原序列,\(s_1 \sim s_n\) 表示其前缀和数组。

  1. 一个括号序列合法 当且仅当 \(s_i\) 全部非负且 \(s_n = 0\)

  2. 一个括号序列的前缀任意位置非负(注意并非合法)当且仅当 \(s_i\) 全部非负。
    下面称这种情况为前缀合法

  3. 一个括号序列的后缀任意位置非负(注意并非合法)当且仅当 \(s_n\) 为整个 \(s\) 数组的最大值(不需要严格)。
    下面称这种情况为后缀合法

  4. 在一个括号序列中,若想找出最长的前缀合法子序列,可以在原数组中从前往后贪心,如果遇到一个 \(s_i < 0\) 的位置则删掉 \(a_i\)(显然 \(a_i\) 一定为 \(-1\))。
    同时不难发现最长前缀合法子序列的长度为 \(n + \max(0 , \min\{ s_i \})\)。此处 \(s_i\) 是对于原序列而言的

  5. 在一个括号序列中,若想找出最长的后缀合法子序列,只需要删除若干个任意位置的 \(-1\)\(s_n\) 变成 \(s\) 的非严格最大值即可,需要删除的个数显然是 \(\max \{ s_i \} - s_n\)(此处 \(s_i\) 仍然对于原序列而言)。
    最长后缀合法子序列的长度也就是 \(n - (\max \{ s_i \} - s_n)\)

  6. 在一个括号序列中,若想找出最长的前缀合法且后缀合法的子序列,先进行 #4 中的操作,再进行 #5 中的操作即可。
    例题:洛谷 P12547


天依宝宝可爱!

posted @ 2025-11-17 11:51  little__bug  阅读(4)  评论(0)    收藏  举报