这真的是一道综合题。然而感觉A得莫名其妙,交上去的时候其实非常虚,然后就莫名其妙地AC了?
首先我们考虑到,所有和怼有关的操作都是时刻无关的。也就是说,我们把这些操作拆散放到任何时候都对结果不会有影响。因此我们考虑把这些操作剥离出来。换言之,我们可以把所有2操作剥离出来。
为什么剥离2号操作呢?因为只要二号操作和自己的生命有关(你不妨理解为xu`ming)。也只有这一种操作时与时刻有关的。什么叫做与时刻有关呢?就是说,这批操作,放在1-3时间点执行是可以的,而放在8-10时间点执行可能就会GameOver。
考虑到其余操作的时刻无关性,我们只需要丢给它们一个单一量
D
D
表示最大空余天数就可以了。
注意这个天数为何要取最大?因为这个天数是益多不宜少的。毕竟时间多的话可以拿来刷水题,少的话就要gg了。
得到的天数以后,我们可以考虑对大佬的事情。
首先我们发现把1号操作单独作为一种决策太浪费了,毕竟它是那样的有规律。我们不妨将1号操作扔进最后的状态判断里。
现在不管一号操作,我们就只有最多两次怼的机会。最多两次?最多两次?
看到这里应该已经能想到单调性了。如果我们第一次怼多,第二次必然怼少,才能满足要求。那么,究竟要满足什么样的要求呢?
我们这样考虑。假设第一次怼的消耗与天数分别是,第二次是
fj,dj
f
j
,
d
j
,那么显然有
fi+fj<=c
f
i
+
f
j
<=
c
同时还有
fi+fj+(D−di−dj)>=c
f
i
+
f
j
+
(
D
−
d
i
−
d
j
)
>=
c
将第二个式子变形为
fi−di+fj−dj>=c−D
f
i
−
d
i
+
f
j
−
d
j
>=
c
−
D
使用尺取法。在以 f f 为第一关键字排序后,将从右向左扫描,同时不断更新合法的 i i 。考虑到如果一个合法,那么任意 k<=i k <= i 必然合法,于是我们记录一个前缀最大值,但是记录的是 fk+dk(k<=i) f k + d k ( k <= i ) 的最大值。每刷出 (i,j) ( i , j ) 的时候,用这个值去更新答案,看看是否大于 c−D c − D 。如果大于那么该情况成立。否则继续直到大于为止。如果找不到,那就意味着该情况不成立了。