提交时间:2024-04-14 14:23:55

运行 ID: 28339

#include <bits/stdc++.h> using namespace std; //#define int long long const int MXN=1000030; const int MXM=30; int n,a[MXN],p[MXN]; int pre[MXM+10],suf[MXM+10]; long long s[MXM+10]; int cnt[MXN]; set<int>S; inline bool cmp(int x,int y){return a[x]>a[y];} int lst[MXN]; int 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; for(int i=1;i<=n;i++)cin>>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; } long double A=0,B=0; for(int i=1;i<=kp;i++) A+=(pre[i-1]-pre[i])/powl(2,i-1); for(int i=1;i<=ks;i++) B+=(suf[i]-suf[i-1])/powl(2,i-1); res+=A*B/nn*a[x]/2; } //for(int i=1;i<=MXM;i++)res=res+(long double)s[i]/nn/powl(2,i); printf("%.5Lf\n",res); cout.flush(); fflush(stdout); return 0; }