题解 P5242 【[USACO19FEB]Cow Dating】
1.前言
做完这道题,我一看题解就懵了,这些都是什么神仙三分,神仙做法。
2.做法
我的做法也是决策单调性,但是我们要证明一下,这个东西为什么有决策单调性。
假设
则原式
为了方便,现在假设
则
我们考虑把
再次为了方便,假设
则
根据
等式变形之后,可以得到
这样问题就变得十分简单了,对于每个
这当然可以二分,时间复杂度
但是显然的,这个是具有单调性的,所以你可以直接用单调性做,时间复杂度
(因此其实主要原因不是答案决策有单调性(答案的确也有单调性),而是找到最远的r使b的和<1具有单调性,使得答案也有单调性)
3.代码
我写的是
#include<bits/stdc++.h>
#define inf 1e9
#define eps 1e-6
#define N 1000010
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
inline ll read()
{
char ch=getchar();
ll s=0,w=1;
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){s=s*10+ch-'0';ch=getchar();}
return s*w;
}
double A=1,B;
int n,R=0;
double p[N],ans;
int main()
{
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
n=read();
for(register int i=1;i<=n;i++)p[i]=read(),p[i]/=1e6,ans=max(ans,p[i]);
//L左端点,R右端点
for(register int L=1;L<=n;L++)
{
while(R<n&&B<1){R++;B+=p[R]/(1-p[R]);A*=(1-p[R]);}//单调性
ans=max(ans,A*B);//统计答案
A/=(1-p[L]);B-=p[L]/(1-p[L]);//把L变成L+1
}
printf("%d\n",int(ans*1e6));
return 0;
}
(我10行头文件被说:很遗憾,您上传的题解【题解 P5242 【[USACO19FEB]Cow Dating】】因为【拒绝: 请勿在代码前添加超长预编译指令】未能通过审核。)了??
如果认为我这篇题解对你有帮助的可以给我点一下赞qwq。如果有任何疑问,或者认为我的题解有什么问题的话,请务必私信我,感激不尽!我会努力把我的题解写得最好的!