Loading

P8392 [BalticOI 2022] Uplifting Excursion (Day1)

牛大了这道题。

考虑差不多得了思维,你现在要选出最多的数使得和为 \(l\),我刚开始想构造一个基本状态,然后往里面放 \(-i, i\) 啥的,后面发现完全没有道理。差不多得了是指,我们选出若干个数,和 \(s\)\(l\) 差一个很小的数,但是可以保证目前选出的数是最多的,最后可以调整一下调整到 \(l\),考虑分成这两步怎么做。

有了目标,构造出这个 \(s\) 是简单的,先将所有数都给选上,你可以根据大小关系,每次将最小/最大的数的扔掉,这样子不断调整,最后总能得到一个 \(s\) 使得 \(|s - l| \le m\),充要性好证明,因为每次选择最大最小扔掉,所以选出的数必定是最多的。

那么有了 \(s\),思考最后怎么调整,此时一定是,从已经选出的数中删去若干个数,再加入若干个数,可以说明的是,数的个数变化量不会超过 \(2m\),因此我们对于这个东西直接做背包,二进制分组一下即可做到 \(O(m^3 \log V)\) 了。

遇到这种题目最重要的还是想到差不多得了,以及调整法思维,还有正难则反等。

posted @ 2026-01-23 17:16  Alexande  阅读(2)  评论(0)    收藏  举报