1 条题解

  • 0
    @ 2026-9-3 10:39:47

    题解

    思路

    从直接枚举窗口逐步优化到动态维护次序统计量;满分算法把“最大中位数”转化为关于候选值的单调判定,再使用二分答案。

    子任务一:枚举并排序

    枚举所有长度至少为 kk 的子数组,复制并排序,直接读取题目定义的位置。复杂度为 O(n3log⁡n)O(n^3\log n),足以处理 n≤40n\le40。

    子任务二:动态维护次序统计量

    固定左端点并逐步扩展右端点。把当前子数组的元素加入值域树状数组;当长度至少为 kk 时,用树状数组二分第 ⌊(x+1)/2⌋\lfloor(x+1)/2\rfloor 小的元素。复杂度为 O(n2log⁡n)O(n^2\log n),适用于 n≤2000n\le2000。

    子任务三:二分答案

    二分一个候选值 xx。把每个 ai≥xa_i\ge x 记为 +1+1,其余记为 −1-1。一个子数组的中位数至少为 xx,当且仅当它的变换后元素和严格大于零。

    记前缀和为 sis_i。扫描右端点 i≥ki\ge k,维护 s0,…,si−ks_0,\ldots,s_{i-k} 的最小值;若 sis_i 大于这个最小值,就存在合法子数组。该判定为 O(n)O(n),总复杂度为 O(nlog⁡n)O(n\log n),空间复杂度为 O(n)O(n)。

    注意严格大于零不可写成大于等于零;偶数长度时,这正好区分题目采用的较小中位数。

    做法

    二分 xx,将 ai≥xa_i\ge x 映射为 11,其余映射为 −1-1。计算前缀和并扫描右端点;扫描到 ii 时先把 si−ks_{i-k} 纳入前缀最小值。若当前前缀和严格大于此前缀最小值,则接受 xx。最终输出最大的可接受候选值。

    复杂度

    满分算法的时间复杂度为 O(nlog⁡n)O(n\log n),空间复杂度为 O(n)O(n)。

    • 1

    信息

    ID
    1272
    时间
    2000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    0
    上传者