HNOI2017 大佬 - DP,BFS,Hash,单调性

1 篇文章 0 订阅
1 篇文章 0 订阅

这真的是一道综合题。然而感觉A得莫名其妙,交上去的时候其实非常虚,然后就莫名其妙地AC了?


首先我们考虑到,所有和怼有关的操作都是时刻无关的。也就是说,我们把这些操作拆散放到任何时候都对结果不会有影响。因此我们考虑把这些操作剥离出来。换言之,我们可以把所有2操作剥离出来。

为什么剥离2号操作呢?因为只要二号操作和自己的生命有关(你不妨理解为xu`ming)。也只有这一种操作时与时刻有关的。什么叫做与时刻有关呢?就是说,这批操作,放在1-3时间点执行是可以的,而放在8-10时间点执行可能就会GameOver。

考虑到其余操作的时刻无关性,我们只需要丢给它们一个单一量 D D 表示最大空余天数就可以了。
注意这个天数为何要取最大?因为这个天数是益多不宜少的。毕竟时间多的话可以拿来刷水题,少的话就要gg了。

得到的天数以后,我们可以考虑对大佬的事情。
首先我们发现把1号操作单独作为一种决策太浪费了,毕竟它是那样的有规律。我们不妨将1号操作扔进最后的状态判断里。
现在不管一号操作,我们就只有最多两次怼的机会。最多两次?最多两次?
看到这里应该已经能想到单调性了。如果我们第一次怼多,第二次必然怼少,才能满足要求。那么,究竟要满足什么样的要求呢?

我们这样考虑。假设第一次怼的消耗与天数分别是fi,di,第二次是 fj,dj f j , d j ,那么显然有
fi+fj<=c f i + f j <= c
同时还有
fi+fj+(Ddidj)>=c f i + f j + ( D − d i − d j ) >= c
将第二个式子变形为
fidi+fjdj>=cD f i − d i + f j − d j >= c − D

使用尺取法。在以 f f 为第一关键字排序后,将j从右向左扫描,同时不断更新合法的 i i 。考虑到如果一个i合法,那么任意 k<=i k <= i 必然合法,于是我们记录一个前缀最大值,但是记录的是 fk+dk(k<=i) f k + d k ( k <= i ) 的最大值。每刷出 (i,j) ( i , j ) 的时候,用这个值去更新答案,看看是否大于 cD c − D 。如果大于那么该情况成立。否则继续直到大于为止。如果找不到,那就意味着该情况不成立了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值