LOJ #2839「JOISC 2018 Day 3」安全门

博客探讨了一种好的括号序列定义,并详细解释了一道关于判断带有通配符的括号序列是否能形成合法序列的问题。博主讨论了不同情况下的解题策略,包括奇数长度的排除、前缀和的合法性条件,以及三种可能的序列类型。通过动态规划的方法,博主给出了O(n^3)复杂度的解决方案,同时提到了特殊情况的处理和重复计算的避免。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意

一个括号序列被称为好的当且仅当将某一连续子段取反后是一个合法的括号序列。现在有一个带有通配符的括号序列,求有多少个好的括号序列能匹配上。
n≤300n\leq 300n300

题解

这个题是WC时yml讲到的。其实在讲课前很久就看过这题了,当时想了几天,一点不会,连多项式算法都想不到。听了题解,感觉实在很厉害,确实难想。
先判掉nnn为奇数的情况。
定义一侧前缀和合法当且仅当它始终≥0\geq 00,显然一个是合法括号序列当且仅当两侧前缀和均合法。
假设翻转了[l,r][l,r][l,r]后合法,显然有Sr=Sl−1+Sn2S_r=S_{l-1}+\frac{S_n}{2}Sr=Sl1+2Sn∀Si≥0,i∈[0,l−1]\forall S_i \geq 0,i \in[0,l-1]Si0,i[0,l1]∀Si≤2∗Sl−1,i∈[l,r]\forall S_i \leq 2*S_{l-1},i \in [l,r]Si2Sl1,i[l,r]∀Si≥Sn,i∈[r+1,n]\forall S_i \geq S_n,i \in[r+1,n]SiSn,i[r+1,n]
一个好的序列可以分成三种情况:

  1. 本身就是一个合法括号序列
  2. 一侧不合法,一侧合法
  3. 两侧均不合法

第一种情况容易处理。
第二种情况,可以不用考虑第三条限制。不妨假设从左往右不合法,那么为满足第一条限制,考虑取第一次SSS变为−1-11前的最大值AAA,显然翻转时取AAA的位置为左端点最有可能成功。令B=SnB=S_nB=Sn,有B≤0B\leq 0B0,则右端点的值为A+B2A+\frac{B}{2}A+2B,并且为满足第二条限制,会取最前面的一个,要求第一次变为−1-11到这个位置的数满足第二条限制。那么枚举AAABBB的值,以及第一次变为−1-11的位置,直接dp可以做到O(n4)O(n^4)O(n4),不能通过。
注意到若将后面的数全部减去BBB,则2∗A2*A2A变为2∗A−B=2∗(A−B2)2*A-B=2*(A-\frac{B}{2})2A

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值