Solution - P4597 序列 sequence
idea:
贪心?大根堆, 分析(不会)
解决方案:
首先,有一个显然的 方法:
令 表示前 个固定,第 个放了第 大的数的最小花费。 表示第 大的数的值。有 方程:
这玩意求个前缀最小值就可以 了,但是通不过这道题。
然后去看题解,发现大佬都在分析凸包什么的,看不懂,只能看一个稍微平易近人的分析方法(类似于反悔贪心)。
假设现在加入一个数 ,已经搞好的数列的最大值为 。那么如果 ,我们是不需要操作的。如果 ,那么我们可以在 中找到一个值 ,让 和 都等于 。显然最优是让 都降到 。
但这样是有问题的,因为 降到 后,前面的数列就不再单调不降了。那为何这样做是对的呢?我们来看看:
现在数列长这样:
1 | 5 . |
现在飞进来一个 ,那么我们会想把数列变成这样:
1 | 5 |
花费了 。但要是再飞进来一个 ,我们就想:要是当年把第三个和第四个数都降到 就好了,这样可以在花费相同的情况下使最大值小一点。
目标是这样的:
1 | 5 |
实际上只需要花费 。如果我们不管数列是否合法的话,我们会这样:
1 | 5 . |
变成:
1 | 5 |
变成:
1 | 5 |
也就是说,这么做不仅可以使当前贡献计算正确,还可以为未来谋取最优解。
十行 :
1 |
|