atcoder
(老版atcoder和新版的访问速度不是一个级别的(划掉)
这个题一个很关键的点:只考虑\(x,y\),不考虑\(z\)
我们假设\(i\)选择\(A_i\),\(j\)选择\(B_j\)比两者交换选择时更优,则有\(A_i+B_j>A_j+B_i\),移项得\(A_i-B_i>A_j-B_j\).做到这里一个显然的贪心就出来了:我们将所有的人按照\(A_i-B_i\)从大到小排序,前\(x\)个人选择\(A_i\),剩下的\(y\)个人选择\(B_i\)即为最优决策
那么现在再来考虑\(z\)的情况,首先继续按照\(A_i-B_i\)排序,那么同样不会存在排在前面的选择\(B_i\)同时排在后面的选择了\(A_i\)的情况,因此必然存在一个分界点使得分界点之前的一段不会出现\(B_i\),分界点之后的一段不会出现\(A_i\).再考虑\(C_i\)就会发现这两段分别是与最开始相同的问题,我们对每个子问题开一个堆,同时在枚举分界点的过程中维护当前所选择的\(A_i\)或者是\(B_i\)即可,具体过程可以参照下面的代码
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include