题意:
思路:
做法就是贪心
贪心结论就是,每次选合法的券中优惠最大的
合法指本身的价格够上L值
因此我们可以把物品和券都排序
对于每个物品,我们把合法的券扔进优先队列中,找到d最大的即可
注意到可以选的券具有单调性,可以用双指针维护
Code:
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int mxn=2e5+10;
const int Inf=0x3f3f3f3f;
struct ty{
int d,l;
}a[mxn];
priority_queue<int> Q;
int N,M;
int p[mxn],d[mxn],l[mxn];
bool cmp(ty x,ty y){
if(x.l==y.l) return x.d<y.d;
return x.l<y.l;
}
void solve(){
cin>>N>>M;
for(int i=1;i<=N;i++) cin>>p[i];
for(int i=1;i<=M;i++) cin>>a[i].l;
for(int i=1;i<=M;i++) cin>>a[i].d;
sort(p+1,p+1+N);
sort(a+1,a+1+M,cmp);
int j=1;
int ans=0;
for(int i=1;i<=N;i++){
while(j<=M&&a[j].l<=p[i]) Q.push(a[j].d),j++;
if(Q.size()){
ans+=p[i]-Q.top();
Q.pop();
}else{
ans+=p[i];
}
}
cout<<ans<<'\n';
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int __=1;//cin>>__;
while(__--)solve();return 0;
}