题意:
给你n个数,你可以任选L,R,使得L到R范围内的数取平均值,要求使得输出的字典序最小,并输出修改后的数。
思路:
分块 每块的平均值一样
后一块平均值小于前一块则后一块归入前一块,前一块重新赋平均值,后一块消失。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod = 1e9 +7;
const ll MAXN = 1e6 + 5;
int n;
int len[MAXN];
double a[MAXN];
double b[MAXN];
double s[MAXN];
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
int temp;
scanf("%d",&temp);
a[i]=temp;
s[i]=s[i-1]+temp;
}
int p=0;
for(int i=1;i<=n;i++){
b[++p]=a[i];
len[p]=1;
while(p>1 && b[p]<b[p-1]){
b[p-1]=(b[p]*len[p]+b[p-1]*len[p-1])/(len[p]+len[p-1]);
len[p-1]+=len[p];
p--;
}
}
for(int i=1;i<=p;i++){
for(int j=1;j<=len[i];j++){
printf("%.12lf\n",b[i]);
}
}
return 0;
}
/* 12 8 10 4 6 6 4 1 2 2 6 9 5 */