1 条题解
-
0
水果序列 题解
思路
固定右端点 ,记 。随着 增大, 单调不增。设当前结尾连续
1的长度为 ,其起点为 。若新字符为
0,已有 不变,并新增 。若新字符为1,对于 有 ;对于 ,这些子串全为1,对应值依次为 。做法
子任务 1 枚举所有子串,再线性扫描其中最长连续
1段,复杂度 。子任务 2 固定左端点并逐步扩展右端点,同时维护当前连续段和历史最大值,复杂度 。
满分算法用单调栈维护当前连续段以前的 。栈中每段记录相同值及其出现次数。当前连续段长度从 增至 时,弹出栈尾所有小于 的段并把它们合并为值 ;当前连续段内部的贡献为 。遇到
0时,将上一连续段的 依次并入栈,再加入一个零值位置。每个位置只被加入、合并和弹出常数次。正确性证明
对每个右端点,栈准确表示当前连续段起点以前所有 ,且按 单调不增。加入
1后,跨越当前连续段起点的子串只可能把最长段更新为 ,弹出并合并所有小于 的栈尾恰好完成 ;完全位于当前连续段内的子串最长段依次为 到 。加入0时最长段不变,提交上一连续段并新增零值即得到全部 。因此每轮累加的是所有以该位置为右端点的 之和,再对所有右端点求和即为答案。复杂度
时间复杂度 ,空间复杂度 。
- 1
信息
- ID
- 1250
- 时间
- 2000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者