关于括号序列
感觉这个东西好多性质啊……
也可能是我太菜了qwq
欢迎补充喵!
下面括号序列就是一个只由 \(-1,1\) 组成的序列,可以认为 \(1\) 代表左括号,\(-1\) 代表右括号。\(a_1 \sim a_n\) 表示原序列,\(s_1 \sim s_n\) 表示其前缀和数组。
-
一个括号序列合法 当且仅当 \(s_i\) 全部非负且 \(s_n = 0\)。
-
一个括号序列的前缀任意位置非负(注意并非合法)当且仅当 \(s_i\) 全部非负。
下面称这种情况为前缀合法。 -
一个括号序列的后缀任意位置非负(注意并非合法)当且仅当 \(s_n\) 为整个 \(s\) 数组的最大值(不需要严格)。
下面称这种情况为后缀合法。 -
在一个括号序列中,若想找出最长的前缀合法子序列,可以在原数组中从前往后贪心,如果遇到一个 \(s_i < 0\) 的位置则删掉 \(a_i\)(显然 \(a_i\) 一定为 \(-1\))。
同时不难发现最长前缀合法子序列的长度为 \(n + \max(0 , \min\{ s_i \})\)。此处 \(s_i\) 是对于原序列而言的 -
在一个括号序列中,若想找出最长的后缀合法子序列,只需要删除若干个任意位置的 \(-1\) 把 \(s_n\) 变成 \(s\) 的非严格最大值即可,需要删除的个数显然是 \(\max \{ s_i \} - s_n\)(此处 \(s_i\) 仍然对于原序列而言)。
最长后缀合法子序列的长度也就是 \(n - (\max \{ s_i \} - s_n)\)。 -
在一个括号序列中,若想找出最长的前缀合法且后缀合法的子序列,先进行 #4 中的操作,再进行 #5 中的操作即可。
例题:洛谷 P12547。
天依宝宝可爱!

浙公网安备 33010602011771号