1 条题解
-
0
思路分析
遇到环形的结构,我们考虑将问题转化为线性:将原数组复制一份,得到长度为 的序列 。对于每个可能的旋转起点 (),旋转后的序列即为 。我们需要统计这个序列中前缀严格最大值的个数,并求出最大值。
对于 中的每个位置 (),考虑它成为旋转后序列中一个“记录”的条件。设 为 左边第一个满足 的位置(若不存在则为 )。那么对于旋转起点 ,当且仅当 (即 在旋转后的区间内)且 (即从 到 之间没有大于等于 的数,因此 是当前最大值)时, 会成为新的记录。
因此,每个 会对所有满足 的 贡献一次。我们只需要对每个 统计有多少 的区间覆盖了 ,然后取最大值即可。
由此我们可以解决本题:
-
将原数组复制一倍,得到数组 。
-
使用单调栈(维护非递增序列)计算每个 的 。
-
建立差分数组 (长度为 ),对于每个 :
-
计算左端点 ,右端点 。
-
若 ,则 ,。
-
-
遍历从 到 的每个 ,累加差分值 ,更新答案 。最后输出即可。
复杂度
时间:,单调栈和差分均为线性。
空间:。
-
- 1
信息
- ID
- 11495
- 时间
- 1000ms
- 内存
- 1024MiB
- 难度
- 10
- 标签
- 递交数
- 2
- 已通过
- 0
- 上传者