提交时间:2024-04-14 16:40:10
运行 ID: 28430
#include<bits/stdc++.h> using namespace std; #define int long long #define double long double #define pii pair<int,int> #define fr first #define sc second #define mk make_pair #define lson t[now].ls #define rson t[now].rs const int MAXN=1000010,N=32,inf=1000000000; int n,a[MAXN],b[MAXN],f[N+5][MAXN],lg2[MAXN]; int qry(int l,int r){ if(l<1||r>n)return -1; int g=lg2[r-l+1]; return max(f[g][l],f[g][r-(1<<g)+1]); } int fidl(int x,int p){//cout<<x<<" "<<p<<":"<<endl; int l=0,r=p; while(l<r){//cout<<l<<" "<<r<<endl; int mid=(l+r+1)>>1; if(qry(mid,p)>=a[x]){ l=mid; } else{ r=mid-1; } } return l; } int fidr(int x,int p){//cout<<x<<" "<<p<<":"<<endl; int l=p,r=n+1; while(l<r){//cout<<l<<" "<<r<<endl; int mid=(l+r)>>1; if(qry(p,mid)>a[x]){ r=mid; } else{ l=mid+1; } } return l; } int l[MAXN],r[MAXN],ll,rr; double jc[MAXN],ans; void slv(){ scanf("%lld",&n); jc[0]=1;jc[1]=0.5; for(int i=2;i<=MAXN-5;i++)lg2[i]=lg2[i>>1]+1,jc[i]=jc[i-1]/2; for(int i=1;i<=n;i++){ scanf("%lld",&a[i]); f[0][i]=a[i]; } for(int i=1;1<<i<=n;i++){ for(int j=1;j<=n;j++){ f[i][j]=max(f[i-1][j],f[i-1][j+(1<<i-1)]); } } for(int i=1;i<=n;i++){ int L=i,R=i;ll=rr=0; l[0]=r[0]=i; for(int j=1;j<=25;j++){ L=fidl(i,L-1); l[j]=L;ll=j; if(!L)break; } for(int j=1;j<=25;j++){ R=fidr(i,R+1); r[j]=R;rr=j; if(R>n)break; } double LL=0,RR=0; for(int j=1;j<=ll;j++){ LL+=(l[j-1]-l[j])*jc[j]; } for(int j=1;j<=rr;j++){ RR+=(r[j]-r[j-1])*jc[j]; } ans+=a[i]*2*LL*RR; } printf("%.5Lf",ans/n/n); } signed main(){ slv(); return 0; }