1 条题解

  • 1
    @ 2026-8-17 0:21:04

    P2586 意欲现

    这题咋这么难qwq,以下是我个人理解,若有问题欢迎指出

    一.dp

    这题第一眼就有一个看起来很不优的dp,令 fi,jf_{i,j}[1,i][1,i] 操作变为单调不降且第 ii 个数为 jj 的最少操作次数。

    转移剥蒜就是 $f_{i,j} = \mathop{min}\limits_{k \le j}(f_{i-1,k}+|a_i-j|) $ 。 这样复杂度是 O(an)O(an) 的,其中 aa 是值域,这个显然是过不了的。

    一.注意到神秘小结论然后贪心

    首先有一个神秘小结论,就是对于 acba \le c \le b ,将 a,ba,b 同时变为 cc 的操作次数与 cc 是无关的,证明即 opts=ca+bc=baopts = c - a + b - c = b - a

    然后再说如何贪心,首先前面的数越小对后面越有利,那么根据这个贪心结论我们就可以让前面的数尽可能小,那么我们就需要维护一个前缀最大值,可以直接开个大根堆来维护,具体的,如果我们新加入一个数 xxxx 要小于前缀最大值,那么我们设其最大值为 opop ,然后就将 opxop - x 计入贡献,那么我们就可以将这个最大值剔除,然后替换成两个 xx ,如果小于那直接将 xx 入堆。

    简单说明一下正确性:

    一,为什么要改为 xx 而不是可以更小,首先对于堆贪,是不是可以更小这种决策是可以放在后面决策的,我们目前只需要确保局部最优。

    二,如何满足题目要求一定是原数列里的数,如果说将 opop 改为 xx 后仍然是最大值,其实就天然满足是原数列里的数,若改完之后不是最大值,即存在一个原数列里的数 xakopx \le a_k \le op ,根据最开始的结论,这个具体改后的值我们是不需要管的,也就是说在保证结果不变的情况下,一定有一种解满足题意

    信息

    ID
    1403
    时间
    1000ms
    内存
    256MiB
    难度
    5
    标签
    (无)
    递交数
    62
    已通过
    22
    上传者