1 条题解

  • 0
    @ 2026-1-2 15:50:57

    考虑没有 kk 这个限制的时候怎么做。这是一个反悔贪心的过程:维护一个小根堆,按 ii 从小到大依次扫,我们钦定修改的过程均在 rir_i 处进行。每次向堆中加入 aia_i,然后枚举这个位置上的修改 (ri,wi)(r_i,w_i),如果当前堆顶的值消耗 wiw_i 后总代价不会变劣,则取出。为了反悔,此时需要再向堆中加入 wiw_i。这样可以做到,假设某个物品 aka_k 一开始被 wiw_i 修改,但最优时需要被 wjw_j 修改,那么反悔操作可以被两次从堆中取出 ak,wia_k,w_i 后抵消,即 (akwi)+(wiwj)=akwj(a_k-w_i)+(w_i-w_j)=a_k-w_j

    但是现在有一个 kk 的限制。设 f(x)f(x) 表示恰好取出 xx 个物品时的最小代价。假设在 f(x0)f(x_0) 处取到最小代价,则这时对于某个 x<x0x<x_0xx 从小到大,会优先取耗费代价少的,并且这时由于取的代价都是负的,因此总代价减得很快;然后对于 x>x0x>x_0,又不得不取代价为正的,那也是优先选耗费代价小的。因此 f(x)f(x) 就是一个下凸函数。现在要求 f(k)f(k),那么直接 wqs 二分即可。时间复杂度 O((n+m)lognlogV)O((n+m)\log n\log V)

    • 1

    信息

    ID
    1557
    时间
    3000ms
    内存
    256MiB
    难度
    6
    标签
    递交数
    3
    已通过
    1
    上传者