Loading

[ABC310Ex] Negative Cost

题目解法

是个美难题。我们令 \(M=300\)

首先一个显然的性质就是我们可以控制任意时刻魔力值在 \([0,2M]\),并且我们一个操作序列合法的充要条件是 \(\sum_i C_i\ge 0\)

但是这还远远不够!这题不论是 \(H\) 还是 \(D\) 都是不能接受的天文数字,我们需要分析更多性质才能过掉此题。这种题往往是贪心与性质相互配合,但是这题也并不好按性价比去贪心。

而想要做出这道题需要熟悉鸽巢原理在背包问题中的应用以及对第一个范围性质的深入思考。

我们考虑最优解满足的性质。首先我们可以控制任意时刻的魔力值范围,然后我们可以发现我们可以对最优解进行分段,具体的,我们可以根据鸽巢原理证明最优解一定可以被分成若干段长度小于等于 \(2L\) 的操作序列,我们称这些操作序列为极短合法操作序列。证明考虑对于一个长度大于 \(2L\) 的合法操作序列,一定存在两个位置 \(C_i\) 的前缀和相等,根据鸽巢原理不难发现。

但是我们还是无法通过这道题,不过我们现在拆成若干极短合法操作序列后,既把操作细分成了若干个小范围的段,又能够把 \(C\) 的限制删掉。现在我们可以容易求出每个长度的极短合法操作序列的扣血最大值。

至此我们不难想出根据性价比贪心,感性上我们会选很多性价比最高的段,我们试着证明只会选择少量的其它段。考虑继续上鸽巢原理!显然如果出现了若干连续的段的长度和整除性价比最高的段的长度,那么我们不妨将这若干个段替换成若干性价比最高的段。

于是根据鸽巢原理我们可以证明其它段的段数是不超过 \(2L\) 个的,否则就会出现整除。也就是说其它的操作我们只会用最多 \(4L^2\) 次。

于是我们先对每个在 \([0,2L]\) 中的长度算出最多能扣多少血,然后再找出性价比最高的段,剩余的操作直接 \(\mathcal{O}(L^3)\) 计算,最后枚举剩余操作数即可算出答案。

最后的思考

我们发现我们一共用了整整两次鸽巢原理,为什么这个东西跟背包关系那么大?事实上其它特殊背包问题也需要鸽巢原理,其本质大概是因为背包问题本身就是若干无序的东西累加,而鸽巢原理的意思是说当某一项数据很大时会出现一些重复,利用这种重复的性质我们可以拆解背包的过程,或者去进一步挖掘性质,比如说证明非性价比最高的段只会选最多 \(2L\) 个,因为如果选得更多,对于出现重复的位置我们可以进行替换。

当然这并不说明背包问题总是跟鸽巢原理相关,只是说这些背包问题就是因为存在一些贪心或者性质使得某些东西会重复出现或者会因为被替换而出现的少,从而进行优化。

posted @ 2025-09-30 15:07  lalaouye  阅读(9)  评论(0)    收藏  举报