求助思路
查看原帖
求助思路
538609
Neutralized楼主2022/7/19 19:27

有显然的 dp 方程
dpi,k=minj=1i(dpj1,k1+(ij+1)maxp=jiap)dp_{i,k}=\min_{j=1}^{i}(dp_{j-1,k-1}+(i-j+1)\max_{p=j}^{i}a_p)

由于涉及区间最大值我建了一棵大根笛卡尔树。
算的时候,把每个区间的最大值拎出来,先递归左儿子,然后用左边更新自己,再用左边和自己一起更新右边,再递归右儿子。这样应该是不漏的。

考虑更新右边怎么做,现在已知了左半部分所有的 dp 值,并且分段到右边任意节点的最大值都固定为了 aua_u ,也就是说要对于右边每个点 ii 找到直线 k=au,b=dpj1,k1j×au    [jleft_son{u}]k=a_u,b=dp_{j-1,k-1}-j\times a_u\;\;[j\in left\_son \bigcup \{u\}]i+1i+1 的最小值。

注意到他们的斜率是一样的,这等同于找到截距 dpj1,k1j×audp_{j-1,k-1}-j \times a_u 的最小值,这个可以用普通的李超树维护,因为 (j,dpj1,k1)(-j,dp_{j-1,k-1}) 是固定的,不会改变了。

这样直接用同一个最小值更新右边所有 dp 值,然后和右儿子传回的李超树合并,再回溯到父亲。
复杂度是 nklognnk \log n

但是尝试打了一下,三个样例都寄了(。
想问一下这个思路的正确性在哪一步出了问题。
(现在脑子有点糊如果是神笔问题浪费您的时间请见谅)

2022/7/19 19:27
加载中...