NOI 嘉年华

看这篇题解

对这篇题解做一些解释

首先看到这道题目,时间范围很大,所以我们先考虑如何对区间进行排序,但是你会发现无论是按照左端点排序还是按照右端点排序,都很难DP下去,所以我们只能对时间排序,然而时间非常大,要对时间进行排序,就必须要离散化(这里启发我们,不要太固定思维觉得大的时间无法排序),设离散化之后的时间范围为\([1,T]\),其中\(1≤T≤2n\)

按照时间排序之后,有一个好处,因为题目要求不能相交,所以分在一个嘉年华的活动的起始和终止时间一定是一段一段的(这个起始和终止时间不一定要与某个区间的左右端点重合,比如就考虑把\([l,r]\)时间范围内的所有活动全部分给某一个嘉年华,不用考虑\(l\)\(r\)是哪个区间的端点)

然后来看第一问,还有一个固定思维就是觉得DP的某一维应该设置差值,但还是发现推不出来,所以也不要固执了,直接像题解这么设

然后题解对第一问DP方程的推导,比如第一种情况

这个方程的意思是\([k+1,r]\)的所有活动全部放到第一个嘉年华里面,但是有没有可能我只放一部分呢?其实是不用担心的,如果只放一部分,假设有\(x\)个,我们完全可以选择\([k+1,r]\)中的最后\(x\)个,仍然不会遗漏最终的答案

那么为什么最后统计答案的时候像题解那样子统计就没问题了呢?或者说,为什么最开始设DP数组的状态表示第二组的最大值就行了,而不是其他什么的?

这是因为像题解这样子统计要一定不会遗漏最优答案,我们假设已经得到最优答案,也就是说不可能再找出一种方案,使得这个方案中活动数较少的一组的活动数比这个最优答案中活动数较少的一组的活动数多,那么对于这个最优答案,如果是第二组的活动数更多,根据对称性,我们可以直接对称一下,变成第一组的活动数更多,此时第二组的活动数一定是在第一组选择了其选择的活动之后,从剩下的没有被第一组选择的活动中选择最多的出来得到的,如若不然,那么第二组的活动数就可以增加,此时要么第一组的活动数少于第二组的活动数,要么第二组的活动数仍然少于第一组的活动数,无论哪种情况,都与最优答案的假设矛盾,所以我们不会遗漏最优解

然后是题解对第二问的处理,这个跟北大ACM队的远足这道题目的trick是一样的

然后是题解在推导\(s(l,r)\)的时候,不用向他这么理解。此时\(l,r\)是定值所以\(c\)是常数,假设\(k\)定了,那么随着\(t\)增大,前面一项在减少,后面一项在增加,那么中间就存在交点,设交点在\(t=t_0\)时相交,当\(k\)增大后,显然\(t_0\)也会增大,所以这是单调的;而对每一个\(k\),取交点处肯定是最优的,所以利用单调队列优化就好了

posted @ 2024-02-29 19:55  最爱丁珰  阅读(4)  评论(0编辑  收藏  举报