1 条题解

  • 0
    @ 2026-5-3 19:25:10

    点我传送到题目喵

    思路分析

    遇到环形的结构,我们考虑将问题转化为线性:将原数组复制一份,得到长度为 2n2n 的序列 bb。对于每个可能的旋转起点 ss0s<n0 \le s < n),旋转后的序列即为 bs,bs+1,,bs+n1b_s, b_{s+1}, \dots, b_{s+n-1}。我们需要统计这个序列中前缀严格最大值的个数,并求出最大值。

    对于 bb 中的每个位置 jj0j<2n0 \le j < 2n),考虑它成为旋转后序列中一个“记录”的条件。设 ljl_jjj 左边第一个满足 bljbjb_{l_j} \ge b_j 的位置(若不存在则为 1-1)。那么对于旋转起点 ss,当且仅当 sj<s+ns \le j < s+n(即 jj 在旋转后的区间内)且 lj<sl_j < s(即从 ssj1j-1 之间没有大于等于 bjb_j 的数,因此 bjb_j 是当前最大值)时,bjb_j 会成为新的记录。

    因此,每个 jj 会对所有满足 s[max(lj+1, jn+1), min(j, n1)]s \in [\max(l_j+1,\ j-n+1),\ \min(j,\ n-1)]ss 贡献一次。我们只需要对每个 ss 统计有多少 jj 的区间覆盖了 ss,然后取最大值即可。

    由此我们可以解决本题:

    • 将原数组复制一倍,得到数组 bb

    • 使用单调栈(维护非递增序列)计算每个 jjljl_j

    • 建立差分数组 cc(长度为 n+2n+2),对于每个 jj

      • 计算左端点 l=max(lj+1, jn+1)l = \max(l_j+1,\ j-n+1),右端点 r=min(j, n1)r = \min(j,\ n-1)

      • lrl \le r,则 clcl+1c_{l} \leftarrow c_{l}+1cr+1cr+11c_{r+1} \leftarrow c_{r+1}-1

    • 遍历从 00n1n-1 的每个 ss,累加差分值 cntcnt,更新答案 ans=max(ans,cur)ans = \max(ans, cur)。最后输出即可。

    复杂度

    时间:O(n)O(n),单调栈和差分均为线性。

    空间:O(n)O(n)

    • 1

    信息

    ID
    11495
    时间
    1000ms
    内存
    1024MiB
    难度
    10
    标签
    递交数
    2
    已通过
    0
    上传者