题意:
解法:
答案是非递减的, 因为如果存在递减区间,显然有办法能够通过额外一次操作来减小字典序.
由于是区间操作,因此答案一定是一段一段的区间.
用单调栈维护每段递减区间,当加入一个新的数时,如果合并末尾的两个区间能使得字典序变小则合并。
Code:
#include <bits/stdc++.h>
using namespace std;
#define X first
#define Y second
#define int long long
#define PI pair<int, int>
const int maxm=2e6+5;
const int mod=998244353;
int n,q;
int a[maxm];
struct Node{
int l,r;
double v;
int len(){
return r-l+1;
}
double sum() {
return v*len();
}
}stk[maxm];
int head;
void solve(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
head=0;
for(int i=1;i<=n;i++){
Node t={i,i,a[i]*1.0};
while(head){
double nt_v=(t.sum()+stk[head].sum())/(t.len()+stk[head].len());
if(nt_v<=stk[head].v) {
t.l=stk[head].l;
t.v=nt_v;
head--;
} else {
break;
}
}
stk[++head]=t;
}
for(int i=1;i<=head;i++){
for(int j=stk[i].l;j<=stk[i].r;j++){
printf("%.9f\n",stk[i].v);
}
}
}
signed main() {
// #define MULTI_CASE
ios::sync_with_stdio(0);
cin.tie(0);
#ifndef ONLINE_JUDGE
freopen("../in.txt", "r", stdin);
freopen("../out.txt", "w", stdout);
#endif
#ifdef MULTI_CASE
int T;
cin >> T;
while (T--)
#endif
solve();
return 0;
}