题意:定义一个multiset,每次有两个操作,一个是插入一个大于当前集合已经有的数的数,二是询问集合中的子集和 max-mean的最大值(mean是平均数)。
题解:因为每次加入的肯定是最大的,所以我们必定取这个数,对于从小到大的前缀和,max-mean的值肯定满足凹性,所以对于每一个2询问,最大max-mean的前缀和的位置肯定是递增的,所以我们可以尺取这个位置,时间复杂度O(n)。
AC代码:
#include<stdio.h>
typedef long long ll;
ll a[500005],sum[500005],tot;
int main()
{
ll n;
scanf("%lld",&n);
ll now=0;
double ans=0.0;
for(ll i=0;i<n;i++)
{
ll op;
scanf("%lld",&op);
if(op==1)
{
tot++;
scanf("%lld",&a[tot]);
sum[tot]=sum[tot-1]+a[tot];
}
else
{
if(tot==1)
{
printf("0.0000000000\n");
continue;
}
ans=(double)a[tot]-(double)(sum[now]+a[tot])/(now+1);
while(now+1<tot&&(double)a[tot]-(double)(sum[now+1]+a[tot])/(now+2)>ans)
{
now++;
ans=(double)a[tot]-(double)(sum[now]+a[tot])/(now+1);
}
printf("%.10f\n",ans);
}
}
}