rt。
以下三篇题解有问题:
https://www.luogu.com.cn/blog/Kaiser-Wilheim/solution-p8365 https://www.luogu.com.cn/blog/JSYZCHTHOLLY/solution-p8365 https://www.luogu.com.cn/blog/heruimiao123456/solution-p8365
hack 数据将会放在二楼,防止篇幅过长。
这里简要说明一下 hack 数据的大致结构及 hack 原理:
input:
1003
[1001 个 1] 2 2
[1000 个 1000000] 6 2 1
output:
0
wrong output:
4
未被取模的答案:
4000000028
原理:
以上三篇题解在代码实现中,均对 ai=1 的 bi 相加后取模,而这里不应该取模,因为题目中这样一句话:
注意:你需要最大化体重并将该最大值对 (109+7) 取模,而非最大化体重对 (109+7) 取模的结果。
但是这些题解的代码在错误地取模后仍能 AC。我猜是因为,在数据比较小的时候,取模根本没有影响;而数据比较大的时候,即使取模后,数据也会很大(大概 107∼108 数量级的数仍能贪心出正确结果)。所以使用随机数很难生成 hack 数据,必须手动构造。(也就是数据水)
我这里直接构造一组数据,使得将 ai=1 的 bi 和初始值的相加之和为 109+7,取模后为 0,从而使下一步的贪心做出错误选择(先 +2 然后再 ×2),而不是先 ×2 再 ×2。
这篇题解 甚至还强调了要取模,大概根本没有考虑到这种情况吧。
所以,建议管理员撤下相关题解并加强数据,可以把 hack 数据放在一个不计分的 subtask 里以警示后人。