【2022 省选训练赛 Contest 18 A】B(Splay)

本文介绍了一种使用平衡树优化动态规划算法的方法,以解决在特定条件下选择点以最小化总代价的问题。通过按特定顺序排序并利用平衡树进行区间操作,实现了高效的解决方案。

B

题目链接:2022 省选训练赛 Contest 18 A

题目大意

给你 n 个点,每个点第 i 天的代价是 b[i]+(i-1)a[i]。
然后要你在前 m 天每天选一个点,然后最小化总代价。

思路

首先考虑怎么 DP,观察到如果你选好的一个点集,你可以很容易的得到最优的选的方案。
即按 a i a_i ai 从大到小排,然后每次依次选,这样增长的量就会最小。

我们可以按 a i a_i ai 从大到小排序来 DP,设 f i , j f_{i,j} fi,j 为搞定前 i i i 个,选了 j j j 个的最小费用。
然后每次下一个选或者不选转移,显然超时。
考虑维护每个 f i f_i fi 数组,亦或者说是看一个新的数会产生什么。

然后有一些性质。
首先就是 f i , j f_{i,j} fi,j 的点集必定是 f i , j + 1 f_{i,j+1} fi,j+1 点集的子集,你可以用反证法来得到。
(反正意思就是你不选这个点集的肯定不如 f i , j f_{i,j} fi,j 的点集加上一个数更优)

然后接着就是加入一个数,它能修改的范围一定是一段后缀。
这个也是可以通过反证法得到,根据前面的性质就有了。

那我们就可以通过二分出贡献的后缀。
然后你要支持区间插入,区间加,区间二分,可以用平衡树来实现。
(过程就是维护每个点当前代表的选的个数,以及新选这个需要的费用)

(那你贡献就是一个区间加值,就是后面的一段都要加上你这个 a i a_i ai,因为你每往后一个位置,就多了 a i a_i ai 的费用)

代码

#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC target("avx")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse"
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值