1 条题解
-
-1
#绿,#差分,#括号序列,#DP
暴力,差分
首先可以写出一个暴力。
枚举每一个区间,通过栈判断其是否合法。如果合法就对区间内的所有 都做出 1 的贡献。
由于区间修改,最后查询一次,因此可以差分解决。
期望得分 30 pts。还是差分
对于一个合法的括号序列 ,差分数组中 。
每一次只加减 1,效率显然太慢。
效率太慢?
刚才的差分是工具,现在我们将它当作求解目标。
我们可以直接求出每一个差分值,期望使用线性实现。回顾差分值的定义 。
代表以 i 开头的所有贡献。
代表以 i - 1 结尾的所有贡献,不作用于 ,需要减去。将其带入题目语境。
是包含 但不包含 的括号序列数量,也就是以 开头的括号序列数量。
是包含 但不包含 的括号序列数量,也就是以 结尾的括号序列数量。现在的问题:求解 和 。
使用 dp 解决。先说求解 。
- 括号序列以 开头,前提是 。否则 。
- 从右向左,动态跟进,维护右括号的栈序列。如果 没有匹配的右括号,那么 。
- 假设匹配的右括号是 ,则 。序列 就是 。
求解 也是一样。
- 括号序列以 结尾,前提是 。否则 。
- 从左向右,动态跟进,维护左括号的栈序列。如果 没有匹配的左括号,那么 。
- 假设匹配的左括号是 ,则 。序列 就是 。
时间复杂度是线性的。
算法流程
- 求解 。
- 求解差分数组 。同时复原 ,增加答案。
实现细节
- 题目中提到乘法取模,加法不取模,需要使用 64 位整数。
- 1
信息
- ID
- 2718
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 4
- 标签
- (无)
- 递交数
- 91
- 已通过
- 13
- 上传者