看CF上的博客吧
#include <cstdio>
#include <iostream>
#include <algorithm>
#define fi first
#define se second
using namespace std;
const int N=100010;
int n,x,y;
double a[N],b[N];
inline pair<int,int> solve(double cst1,double cst2){
int cnt1=0,cnt2=0;
for(int i=1;i<=n;i++){
int add1=0,add2=0;
double cur=0;
if(a[i]-cst1>cur)
cur=a[i]-cst1,add1=1,add2=0;
if(b[i]-cst2>cur)
cur=b[i]-cst2,add1=0,add2=1;
if(1-(1-a[i])*(1-b[i])-cst1-cst2>cur)
add1=1,add2=1;
cnt1+=add1,cnt2+=add2;
}
return make_pair(cnt1,cnt2);
}
int main(){
while(~scanf("%d%d%d",&n,&x,&y)){
for(int i=1;i<=n;i++) scanf("%lf",&a[i]);
for(int i=1;i<=n;i++) scanf("%lf",&b[i]);
double l=-1,r=2,mid,cst1,cst2;
while(r-l>1e-7){
mid=(l+r)/2;
double L=-1,R=2,MID;
int cur;
while(R-L>1e-7){
pair<int,int> Q=solve(mid,MID=(L+R)/2);
if(Q.se<=y){
cur=Q.fi; R=MID;
}
else L=MID;
}
if(cur<=x){
cst1=mid; cst2=R; r=mid;
}
else l=mid;
}
double ans=0;
int cnt1=0,cnt2=0;
for(int i=1;i<=n;i++){
int add1=0,add2=0;
double cur=0;
if(a[i]-cst1>cur)
cur=a[i]-cst1,add1=1,add2=0;
if(b[i]-cst2>cur)
cur=b[i]-cst2,add1=0,add2=1;
if(1-(1-a[i])*(1-b[i])-cst1-cst2>cur)
cur=1-(1-a[i])*(1-b[i])-cst1-cst2,add1=1,add2=1;
cnt1+=add1,cnt2+=add2; ans+=cur;
}
printf("%.5lf\n",ans+x*cst1+y*cst2);
}
return 0;
}