一、分析

考虑贪心

将第 \(i\) 张优惠券使用在第 \(j\) 件物品上,则购买第 \(j\) 件物品花费为 \(\max(0,a_j-c_i)\)

。希望每张优惠券去优惠尽量多的价格,而大额优惠券用在原件小的物品上显然是浪费的

因此将优惠劵按 \(c\) 从大到小排序,并讲所有物品放入大根堆中,并依次遍历优惠券,每次选择当前原价最大的物品(设原价为 \(v\) ) 查看是否使用这张优惠卷,若 \(b_i+max(0,v-c_i) ,则使用这张优惠券,因为优惠券不能叠加使用,弹出使用了这张优惠券的物品,并将这张优惠券也看作一个物品,放入大根堆中

二、\(\text{code}\)

#include
#define int long long
using namespace std;
const int N=5e5+5;
int T,n,m,a[N],ans;
struct edge{int b,c;
}e[N];
bool cmp(edge i,edge j){return i.c>j.c;
}
priority_queue q;
signed main(){ios::sync_with_stdio(0);cin.tie(0);freopen("coupon.in","r",stdin);freopen("coupon.out","w",stdout);cin>>T;while(T--){ans=0;cin>>n>>m;for(int i=1;i<=n;i++){cin>>a[i];q.push(a[i]);}for(int i=1;i<=m;i++)cin>>e[i].b;for(int i=1;i<=m;i++)cin>>e[i].c;sort(e+1,e+1+m,cmp);for(int i=1;i<=m;i++){int v=q.top();if(e[i].b+max(0ll,v-e[i].c)