题解:
开始写的是从后往前贪心,前面的平均高度大于后面的高度就合并。但是当时电脑死机就没打了。现在写是正向贪心过去的。用前缀和维护区间长度,然后单调栈维护下降序列。
#include <bits/stdc++.h>
using namespace std;
const int N=1e6+7;
long long s[N];
int a[N];
int st[N];
int main()
{
int n; scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",a+i);
s[i]=s[i-1]+a[i];
}
int top=1;
for(int i=1;i<=n;i++){
while(top>1&&(s[i]-s[st[top]])*(i-st[top-1])<=(s[i]-s[st[top-1]])*(i-st[top])) top--;
st[++top]=i;
}
for(int i=1;i<top;i++){
double res=1.0*(s[st[i+1]]-s[st[i]])/(st[i+1]-st[i]);
for(int j=1;j<=st[i+1]-st[i];j++) printf("%.10lf\n",res);
}
return 0;
}