1 条题解
-
0
题目理解
给定一个长度为 的序列 ,定义子串 的权值为:
要求计算所有连续子串的权值之和,对 取模。
数据范围:
直接枚举所有子串 不可行
算法思路
这道题采用 分治(CDQ 分治) 的方法,每次取区间中点 ,计算跨越中点的所有子串的贡献。
对于区间 ,中点 ,跨越 的子串 满足 。
四种情况
设:
为 的最小值
为 的最大值
为 的最小值
为 的最大值
对于跨中点的子串 ,其:
长度
情况 1:LL
左半部分同时控制最小值和最大值
即 且
贡献为 $ \mathrm{mn}[i] \times \mathrm{mx}[i] \times \sum_{j} (j-i+1) $
情况 2:RR
右半部分同时控制最小值和最大值
即 且
贡献为 $ \mathrm{mnR}[j] \times \mathrm{mxR}[j] \times \sum_{i} (j-i+1) $
情况 3:LR
左半部分控制最小值,右半部分控制最大值
即 且
贡献为 $ \mathrm{mn}[i] \times \mathrm{mxR}[j] \times (j-i+1) $
情况 4:RL
左半部分控制最大值,右半部分控制最小值
即 且
贡献为 $ \mathrm{mx}[i] \times \mathrm{mnR}[j] \times (j-i+1) $
双指针 + 前缀和优化
对于每种情况,使用双指针维护满足条件的 的范围,并用前缀和数组快速计算 和 等,从而在 内完成跨中点计算。
代码结构
:分治主函数
情况 LL:左端控制 min 和 max
情况 RR:右端控制 min 和 max
情况 LR:左 min 右 max,用 和 维护右段信息
情况 RL:左 max 右 min,同样用前缀和优化
递归处理左右子区间
复杂度
每层分治 ,总
空间
总结
这道题是典型的分治统计问题,通过将跨中点子串按最值控制情况分类,并利用双指针和前缀和快速计算贡献,将复杂度从 降为 ,是处理区间最值与子串统计问题的经典方法。
- 1
信息
- ID
- 4440
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者