[wqs二分 DP] Codeforcces 739E. Gosha is hunting

来源:互联网 发布:大数据概念股龙头股票 编辑:程序博客网 时间:2024/06/01 09:52

看CF上的博客吧

#include <cstdio>#include <iostream>#include <algorithm>#define fi first#define se secondusing 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;}