YY一下的话感觉代价关于最晚出分时间是一个单峰函数
三分最晚的出分时间
然后贪心一下算代价就行
如果A>B就只用B就行了
要不然的话出分时间小于当前限制的都可以随便往后调直到到达限制,那么先尽量用A,调不到限制以内的再用B即可
#include<iostream>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<iomanip>
#include<cstdio>
#include<map>
#include<bitset>
#include<set>
#include<queue>
#include<stack>
#include<vector>
using namespace std;
#define MAXN 100010
#define MAXM 1010
#define eps 1e-8
#define ll unsigned long long
#define MOD 1000000007
#define INF 1000000000
ll n,m;
ll a[MAXN],b[MAXN];
ll now;
ll A,B,C;
ll ans=1e18;
ll c[MAXN];
ll OK(ll x){
ll i;
ll re=0;
for(i=1;i<=n;i++){
if(a[i]<x){
re+=(x-a[i])*C;
}
}
int wzh=1;
if(A<B){
ll rem=0;
for(i=1;i<=m;i++){
if(b[i]<x){
rem+=x-b[i];
}
}
for(i=1;i<=m;i++){
if(b[i]>x){
ll t=min(rem,b[i]-x);
re+=A*t;
re+=B*(b[i]-x-t);
rem-=t;
}
}
}else{
for(i=1;i<=m;i++){
if(b[i]>x){
re+=(b[i]-x)*B;
}
}
}
return re;
}
int main(){
ll stdans;
ll i;
scanf("%llu%llu%llu%llu%llu",&A,&B,&C,&n,&m);
for(i=1;i<=n;i++){
scanf("%llu",&a[i]);
}
for(i=1;i<=m;i++){
scanf("%llu",&b[i]);
now=max(now,b[i]);
}
ll l=1,r=now;
//*
while(r-l+1>=4){
ll l1=l+(r-l+1)/3;
ll l2=l+2*(r-l+1)/3;
ll t1=OK(l1);
ll t2=OK(l2);
if(t1<=t2){
r=l2;
}else{
l=l1;
}
}
//*/
for(i=l;i<=r;i++){
ans=min(ans,OK(i));
}
printf("%llu\n",ans);
return 0;
}
/*
*/