专栏文章

题解:P12558 [UOI 2024] Heroes and Monsters

P12558题解参与者 4已保存评论 3

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
3 条
当前快照
1 份
快照标识符
@mip55aum
此快照首次捕获于
2025/12/03 06:19
3 个月前
此快照最后确认于
2025/12/03 06:19
3 个月前
查看原文
模拟赛场切了。括号序列上大分。
我们将题目转化为括号匹配模型:将 SS 中的怪物看做左括号,英雄看做右括号,则:
  • SS 中的所有英雄都高兴的充要条件是:它对应的子括号序列是合法的。
  • 其他英雄都悲伤的充要条件是:它对应的子括号序列将左括号和右括号对调后是合法的。下文我们称这样的括号序列为“合法逆括号序列”。
根据这个,我们可以把题目转化为:
  • 给定一个括号序列,对于每个 kk,问有多少种选择 kk 个右括号的方式,使得存在一种选择左括号的方式,提取这些选择的左括号、右括号形成的括号序列(以下称作序列 11)是合法的,并且剩余的括号序列(以下称作序列 22)是合法逆括号序列。
显然,我们选择前 kk 个左括号一定不劣。
括号序列是可以简单刻画的。我们只需要考虑使用栈匹配括号的过程,记录栈中括号的个数即可刻画其合法性。
分析到这里,我们就有多项式复杂度做法了。我们设 dpi,j,kdp_{i,j,k} 考虑了前 ii 个,序列 11 的栈中有 jj 个左括号,序列 22 的栈中有 kk 个右括号的方案数。
我们发现,j,kj,k 存在线性关系,而 ii 蕴含了序列 11 的左括号个数,结合 jj 可以推出右括号数量,从而此 dp 的复杂度为 O(n2)O(n^2)。做 kk 次即为 O(n3)O(n^3)
做到此处,发现无法优化状态,也不能使用数据结构优化。这使我们怀疑:这个题真的是用 dp 求出答案吗?
这时,转成括号序列的优势就显现出来了。我们很自然地发现,“选前 kk 个左括号”这个条件看起来十分严格,以至于我们在 i=1ki=1\cdots k 的时候的 dpdp 像是在摸鱼:dp 是在同时维护两个括号序列的合法性,而此时序列 22 遇到的只有右括号,一定合法。我们维护了个寂寞!
所以,我们可以从 k+1k+1 开始 dp。然后,相似的情况也发生了:第一个序列此时一定选右括号,一定合法。我们又维护了个寂寞!
于是,正解呼之欲出了。我们按照第 kk 个左括号作为分界线,前面正着 dp,只维护序列 11 的合法性;后面倒着 dp,只维护序列 22 的合法性。在分界线出做一个类似点乘的东西合并答案。
时间复杂度 O(n2)O(n^2)。十分精妙。

评论

3 条评论,欢迎与作者交流。

正在加载评论...