专栏文章

壁壁壁壁壁壁壁

AT_kupc2016_h题解参与者 2已保存评论 3

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
3 条
当前快照
1 份
快照标识符
@mipmf6wx
此快照首次捕获于
2025/12/03 14:23
3 个月前
此快照最后确认于
2025/12/03 14:23
3 个月前
查看原文
sis_i 表示 aa 的前缀和。最基本的想法是 dp\text{dp},令 fi(j)f_i(j) 表示考虑到坐标为 ii 的位置,使用了 jj 个加固材料的最小花费,枚举当前位置有几个加固材料进行转移:fi(j)=min0kjbifi1(k)+jsif_i(j)=\min\limits_{0\leq k\leq j-b_i}f_{i-1}(k)+|j-s_i|。答案为 fn(sn)f_n(s_n)
时间复杂度是 O(nsn2)O(ns_n^2) 的,显然过不去,考虑使用 slope trick\text{slope trick} 优化。把转移方程的绝对值拆开,可得 fi(j)=min0kjbifi1(k)+max(0,jsi)+max(0,sij)f_i(j)=\min\limits_{0\leq k\leq j-b_i}f_{i-1}(k)+\max(0,j-s_i)+\max(0,s_i-j)
所以维护拐点(斜率变化点)只需要先平移,然后取前缀最小值,最后加入两个基本分段线性凸函数即可。注意两个细节:
  1. 答案是 sns_n 位置的函数值,并非整个函数的最小值;
  2. 任何位置的加固材料都需 \geq 需要的材料数量,所以需要提前在堆里面放 nn00
时间复杂度 O(nlogn)O(n\log n)提交记录
附注:官方题解好像做法不是 slope trick\text{slope trick} 优化 dp\text{dp}?但我没太看懂。

评论

3 条评论,欢迎与作者交流。

正在加载评论...