提交时间:2024-04-14 17:35:06

运行 ID: 28460

#include <bits/stdc++.h> using namespace std; //#define int long long const int MXN=1000030; const int MXM=5; int n,a[MXN],p[MXN]; int pre[MXM+10],suf[MXM+10]; set<int>S; inline bool cmp(int x,int y){return a[x]>a[y];} int lst[MXN],nxt[MXN]; inline void ins(int x,int r){ int l=lst[r]; nxt[x]=r; lst[x]=l; lst[r]=x; nxt[l]=x; } signed main(){ ios::sync_with_stdio(0); // freopen("drink.in","r",stdin); // freopen("drink.out","w",stdout); //cin>>n; scanf("%d",&n); //if(n<999990)return 0; for(int i=1;i<=n;i++)scanf("%d",&a[i]),p[i]=i; sort(p+1,p+n+1,cmp); S.insert(0),S.insert(n+1); nxt[0]=n+1; lst[n+1]=0; long double res=0; long double nn=1ll*n*n; for(int i=1;i<=n;i++){ int x=p[i]; for(int i=0;i<=MXM;i++) pre[i]=suf[i]=-1; pre[0]=suf[0]=x; ins(x,*S.upper_bound(x)); S.insert(x); int kp=0; int q=x; while(q&&kp<MXM){ q=lst[q]; pre[++kp]=q; } int ks=0; q=x; while(q&&ks<MXM){ q=nxt[q]; if(!q)break; suf[++ks]=q; } //continue; double A=0,B=0; double e=1; for(int i=1;i<=kp;i++) A+=(pre[i-1]-pre[i])/e,e*=2; e=1; for(int i=1;i<=ks;i++) B+=(suf[i]-suf[i-1])/e,e*=2; res+=A*B*a[x]/2; } //for(int i=1;i<=MXM;i++)res=res+(long double)s[i]/nn/powl(2,i); printf("%.5Lf\n",res/nn); cout.flush(); fflush(stdout); return 0; }