http://codeforces.com/problemset/problem/734/C
题解:枚举第一种buff,然后二分搜索s-bi。因为第二种buff的法力值和完成件数是升序的,可以直接进行二分。
代码:
#include<bits/stdc++.h>
#define debug cout<<"aaa"<<endl
#define mem(a,b) memset(a,b,sizeof(a))
#define LL long long
#define lson l,mid,root<<1
#define rson mid+1,r,root<<1|1
#define MIN_INT (-2147483647-1)
#define MAX_INT 2147483647
#define MAX_LL 9223372036854775807i64
#define MIN_LL (-9223372036854775807i64-1)
using namespace std;
const int N = 200000 + 5;
const int mod = 1000000000 + 7;
LL a[N],b[N],c[N],d[N];
LL n,m,k;
LL x,s,fa;
int l,r,mid,pos;
LL ans,temp;
int main(){
mem(a,0),mem(b,0),mem(c,0),mem(d,0);
scanf("%I64d%I64d%I64d",&n,&m,&k);
scanf("%I64d%I64d",&x,&s);
ans=x*n;
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]);
}
//加上这个a[0]是,不用第一种buff的情况
a[0]=x,ans=x*n;
for(int i=0;i<=m;i++){
fa=s-b[i];
if(fa<0){
continue;
}
l=0,r=k,pos=k;
while(l<=r){
mid=(l+r)>>1;
if(d[mid]>fa){
r=mid-1;
}
else{
pos=mid;
l=mid+1;
}
}
temp=(n-c[pos])*a[i];
ans=min(ans,temp);
}
printf("%I64d\n",ans);
return 0;
}