对此进行调试,想了很多奇怪的想法导致浪费了大量的时间:先是认为若和最小的 x 和其他糖果组合时,它的 y 会不会也和其他糖果组合,经过 10min 我写好了这个判断,但对所有答案没有任何影响。后来又想到对于 x_i 被选择的糖果,会不会它的 y_i 也被其他组合。写了一份堆优化的贪心,每次弹出最小的 2 个值,再加入它们的下一次价格。直到弹出的 2 个数总和 \ge tot 时退出循环,开始买 tot。但是还是无法通过 candy6。
时间已经过去了 1h+,我开始怀疑贪心的正确性,以及这题是否是个贪心或是 dp。
越来越紧张。
想到之前水讨论区看到的,如果卡 T1 则先去打 T4 暴力,这样就只剩 3 题,可以很好调节心态。然后往下去翻 T4,过程中看到 T3 是最最不擅长的树有点害怕。
T4 题面还算是好理解,初看样例发现 m 个区间查询问题,第一眼以为是莫队,然后发现好像没有任何关系。我写了一份较为优化的最基础暴力,直接枚举从 1 到 m,每次跑需要的位置和区间的 l,r。但是又发现了问题:我从未写过将数取模 2^{64} 的题目,导致 long long 没能存下,使用 unsigned long long 后发现这东西从未用过。啥也不了解,咋办啊??然后我最基础的暴力对于所有 k_i i\ge0 都没有问题,但对于样例 1 中的 k_3=-1 我不会取模。不会取模这一整道题都可以丢掉了,好失落啊。我在不断尝试如何将负数取模后,经过了 40min,还是不对。看来好像注定 T4 是个 0 了。
过去 2h 了,我望着我 4 份 0 pts 的代码。
继续折回搞 T1。发现之前的思路都好糊,尝试重新分析:对于第 i 个糖果,我如果会取到 y_i,则说明它的 x+y 是最小的,对啊,说明有且只有一种糖果会取到 y。因为若其他糖果会取到 y 则说明其他糖果的 x_j+y_j 会小于 tot,而我定义了 tot 是最小 x+y,所以这并不可能。那么除了 tot 的糖果,其他所有糖果都是最多取 1 个,所以可以按照 x_i 从小到大排序。将 i 从 0 到 tot 位置扫一遍,计算对于购买前 i 糖果 1 个,剩下全买 tot 的答案,取其最大值就是最终答案了,这很好证明正确性。再用前缀和维护一下前 i 个 x 的总和,计算最大值的复杂度只有 O(n)。
开始重构 T1,没有经过调试,直接通过了 candy6,高兴坏了。将所有大样例都跑了一遍,却又在 candy4 出了问题,我尝试将 i 从 0 到 n 扫一遍,然后就对了,我也不知道为什么,但至少都通过了。