题意:
有一个空的数列现在有两种操作
1.向空的数列添加一个大于数列尾元素的数放在数列的尾部
2.询问最大 子序列的(最大值-该子序列的平均值)的最大值
(子序列不必连续)
分析:
通过分析我们可以知道一定要包含最大值,其他值选择的时候也是从小一个个的去选择。
选择让平均值尽可能的小。。
这个时候我们分析出来就是一个凸形曲线。。
对于凸形曲线用三分。。。
#include<bits/stdc++.h>
using namespace std;
const int N = 5*1e5;
int Q,op;
double x[N],s[N];
int i=0;
double f(int n)
{
return x[i]-(x[i]+s[n])/(n+1);
}
double Solve()
{
int l=1,r=i-1;
int x,y;
while(l<r-2)
{
x=(2*l+r)/3;
y=(2*r+l)/3;
if(f(x)>f(y))
r=y;
else if(f(x)<f(y))
l=x;
else l=x,r=y;
}
double Max=0;
for(int j=l;j<=r;j++){
Max=max(Max,f(j));
}
return Max;
}
int main()
{
cin>>Q;
s[0]=0;
while(Q--)
{
cin>>op;
if(op==1)
{
cin>>x[++i];
s[i]=s[i-1]+x[i];
}
else
{
if(i==1)
printf("0.0000000000\n");
else
printf("%.8f\n",Solve());
}
}
}