1 条题解

  • 0
    @ 2026-9-3 10:59:56

    题解

    思路

    对固定子数组 a[l..r]a[l..r],最优方案中的排序区间可以取为互不相交。位置 kk 可以成为两个独立排序块之间的分界,当且仅当

    max⁡(al,…,ak)<min⁡(ak+1,…,ar).\max(a_l,\ldots,a_k)<\min(a_{k+1},\ldots,a_r).

    因此该子数组的美丽值等于 r−lr-l 减去合法分界点的个数。先把所有子数组的 r−lr-l 求和,再统计每个合法分界的贡献。

    做法

    子任务 1

    枚举 l,r,kl,r,k,直接计算两侧最大值与最小值,复杂度 O(n4)O(n^4)。

    子任务 2

    按右侧最小值所在位置 ii 统计贡献。令 kk 为 ii 左侧最近且满足 ak<aia_k<a_i 的位置,xx 为 kk 左侧最近且满足 ax>aia_x>a_i 的位置,yy 为 ii 右侧最近且满足 ay<aia_y<a_i 的位置;不存在时使用边界 0,n+10,n+1。该位置贡献的合法分界数量为

    (k−x)(y−i).(k-x)(y-i).

    逐位置线性扫描求 x,k,yx,k,y,复杂度 O(n2)O(n^2)。

    满分算法

    用单调栈在线性时间求每个 ii 的 kk 与 yy。建立区间最大值稀疏表;从 kk 向左二进制跳跃,求出最后一个使区间最大值仍小于 aia_i 的边界,从而得到 xx。答案初值为

    ∑d=1n−1d(n−d)=n(n−1)(n+1)6,\sum_{d=1}^{n-1}d(n-d)=\frac{n(n-1)(n+1)}6,

    再减去每个位置的 (k−x)(y−i)(k-x)(y-i)。

    独立实现还可以按值从小到大激活位置,用两个有序集合维护已激活和未激活位置,并得到同一贡献式。

    正确性证明

    若两个排序操作相交,可用它们的并区间替代,代价不增加,所以存在由互不相交区间组成的最优方案。相邻两块能独立排序,当且仅当前块所有元素都小于后缀所有元素,等价于上述最大值小于最小值条件;每保留一个合法分界就比整体排序节省一秒。

    对任意合法三元组 (l,k,r)(l,k,r),令 aia_i 是右段最小值。由互异性,kk 必为 ii 左侧最近的小于 aia_i 的位置,且恰有 x<l≤kx<l\le k、i≤r<yi\le r<y。反之这些范围内任取 l,rl,r 都满足分界条件,故位置 ii 恰贡献 (k−x)(y−i)(k-x)(y-i) 个合法分界。算法枚举所有 ii,无重无漏地减去全部节省量,因此答案正确。

    复杂度

    满分算法每个测试用例时间复杂度 O(nlog⁡n)O(n\log n),空间复杂度 O(nlog⁡n)O(n\log n);所有测试用例按 ∑n\sum n 计。

    • 1

    信息

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