#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <map>
#include <vector>
using namespace std;
typedef long long ll;
const int N=1e5+20;
const ll inf=1e18;
ll a[N],b[N],c[N],d[N];
int main()
{
ll n,x,s;
ll m,k;
cin>>n>>m>>k;
cin>>x>>s;
for(int i=1;i<=m;i++)
scanf("%I64d",&a[i]);
for(int i=1;i<=m;i++)
scanf("%I64d",&b[i]);
for(int i=1;i<=k;i++)
scanf("%I64d",&c[i]);
for(int i=1;i<=k;i++)
scanf("%I64d",&d[i]);
ll ans=n*x;
a[0]=x;
b[0]=0;
//
for(int i=0;i<=m;i++)//枚举要选的第一种Spell(或者不选b[0]=0),第二种Spell减少n个数 显然n越小 解越优
{
ll cost=s;
if(cost<b[i])
continue;
else
{
cost-=b[i];
ll sec=a[i],num=0;
//c[i],d[i]满足单调性 c[i]<c[j]&&d[i]<d[j] j>i
//二分找到最大d[j] 即最大c[j]即可
ll l=1,r=k;
while(l<=r)
{
ll mid=(l+r)/2;
if(d[mid]<=cost)
{
l=mid+1;
num=c[mid];
}
else
{
r=mid-1;
}
}
// cout<<sec<<' '<<n-num<<endl;
ans=min(ans,sec*(n-num));
}
}
cout<<ans<<endl;
return 0;
}
Codeforce 734C Anton and Making Potions 枚举+二分
最新推荐文章于 2019-08-13 21:26:09 发布