题目
你有n个水槽,分别装ai的水。
你可以选定一个区间,平均他们的水。
你可以进行上述操作任意次。
请最小化ai的字典序,并输出。
N<=1e6
思路
一个很好的性质是,前缀和之后字典序大小关系不变。
把前缀和求出来,放到坐标系中
发现最小字典序是他们的凸壳
代码
#include<bits/stdc++.h>
#define ll long long;
using namespace std;
const int N=1e6+77;
double a[N],b[N];
int c[N],yjy=0;
int main()
{
int n;
cin>>n;
for(int i=1; i<=n; i++)
{
scanf("%lf",&a[i]);
}
for(int i=1; i<=n; i++)
{
b[++yjy]=a[i];
c[yjy]=1;
while(yjy>1&&b[yjy]<b[yjy-1])
{
b[yjy-1]=(b[yjy-1]*c[yjy-1]+b[yjy]*c[yjy])/(c[yjy-1]+c[yjy]);
c[yjy-1] += c[yjy];
yjy--;
}
}
for(int i=1; i<=yjy; i++)
{
for(int j=1;j<=c[i];j++)
{
printf("%.15lf\n",b[i]);
}
}
}