【八校联考2013】军训

题目大意

有一个长度为 n 的二元组数组,要求把它划分为若干段,不妨设划分出了m段,二元组 i 的第一个数为ai,第二个数为 bi ,要求在满足

m1i=0(maxrij=liaj)<=limitA

的情况下,最小化

maxm1i=0(rij=libj)

其中 n<=20000


分析

答案显然可以二分,记为 limitB ,然而二分后直接乱塞显然是 0 分的。
考虑dp,记 fi 表示将 i 之前的塞好了的组的和的最小值。
O(n2)的转移很显然。

fi=maxj<i,il=j+1bl<limitB(fj+maxik=j+1ak)

然而总时间复杂度 O(nlog2n) 无法接受。
考虑两个决策 k l k<l ,实际上它们转移给后面的状态的值可以分成两部分,第一部分是 fk fl ,这部分只会修改一次。第二部分是每组中的最大值,记为 maxik maxil ,若 maxikmaxil ,那么影响 maxik 的值的二元组必定在 j 之前,否则必定在j之后。也就是说一旦 maxik=maxil 那么他们再也不可能不相等,我们可以将它们捆绑在一起更新第二部分的值。

然后不妨用线段树来维护决策 fj+maxik=j+1ak 的值。那么计算 fi 的时间复杂度降到了 O(logn) 。而维护这个值我们也是分开两部分维护,对于第一部分是简单的单点查询和维护最小值,第二部分是区间修改,再维护一个和的最小值,这道题就做完了。

由于我们每一次需要合并若干个组,然后将它们的 maxi 统一赋值。而 n 个组最多只需要合并成一个。那么合并以及对maxi维护的的总的复杂度是 O(nlogn) 的。

时间复杂度 O(nlog2n) ,空间复杂度 O(n)


后记

这道题我在比赛时想的是用单调队列来维护决策。然而无法处理转移决策范围的问题。也就是说最优决策不一定能选到。其实这里用线段树就可以简单地回避了这个问题了,只是我没有去想如何很好的维护这个值,也有一点受之前做这类题目的影响吧。然而维护这个值并不是特别难的。

这道题算是对线段树使用的一个不错的技巧题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值