提交时间:2024-04-14 14:56:38

运行 ID: 28370

#include<bits/stdc++.h> #define double long double using namespace std; int n;int a[1000050]; double ans=0; int b[100050]; double val[500050]; #define ls p*2 #define rs p*2+1 #define mid (l+r)/2 long long tag[400050]; inline void pu(int p){ val[p]=val[ls]+val[rs]; }inline void pd(int p){ val[ls]/=tag[p]; val[rs]/=tag[p]; //if(val[ls]<=1e-10) val[ls]=0; //if(val[rs]<=1e-10) val[rs]=0; tag[ls]*=tag[p]; tag[rs]*=tag[p]; tag[ls]=min((long long)1e9,tag[ls]); tag[rs]=min((long long)1e9,tag[rs]); tag[p]=1; }inline void bd(int p,int l,int r){ tag[p]=1; if(l==r) return ; bd(ls,l,mid); bd(rs,mid+1,r); pu(p); }inline void upd1(int p,int l,int r,int x,double v){ if(l==r&&l==x){val[p]+=v;return ;} pd(p); if(x<=mid) upd1(ls,l,mid,x,v); else upd1(rs,mid+1,r,x,v); pu(p); }inline void upd2(int p,int l,int r,int pl,int pr){ if(pl<=l&&r<=pr){ val[p]/=2.0; //if(val[p]<=1e-10) val[p]=0; tag[p]*=2; return ; }pd(p); if(pl<=mid) upd2(ls,l,mid,pl,pr); if(pr>mid) upd2(rs,mid+1,r,pl,pr); pu(p); //cout<<val[p]<<' '; }inline double qu(int p,int l,int r,int pl,int pr){ if(pl<=l&&r<=pr) return val[p]; pd(p); double res=0; if(pl<=mid) res+=qu(ls,l,mid,pl,pr); if(pr>mid) res+=qu(rs,mid+1,r,pl,pr); return res; } int c[1200050][25]; int lg[1000560]; void init(){ for(int i=1;i<=n;i++) c[i][0]=a[i]; for(int j=1;j<=21;j++){ for(int i=1;i<=n;i++) c[i][j]=max((i+(1<<(j-1))>n)?(0):(c[i+(1<<(j-1))][j-1]),c[i][j-1]); }for(int i=2;i<=n;i++) lg[i]=lg[i/2]+1; }inline int q(int l,int r){ return max(c[l][lg[r-l+1]],c[r-(1<<lg[r-l+1])+1][lg[r-l+1]]); }inline int BS(int l,int r,int x){ if(l>r) return 0; while(l<r){ //cout<<l<<' '<<r<<' '<<q(6,9)<<' '; if(q(mid+1,r)>x) l=mid+1; else r=mid; }if(q(l,l)<=x) return 0; else return l; } void slv3(){ for(int i=1;i<=n;i++) scanf("%d",&a[i]); bd(1,1,1e5+1); init(); for(int i=1;i<=n;i++){ double cntv=0; double now=a[i]/2.0; //val[i]+=now; int it=i; int d1=0; while(it!=0&&d1<=20){ d1++; int las=it; it=BS(1,it-1,a[i]); cntv+=now/n/n*(las-it); now/=2; //cout<<it<<endl; }//cout<<endl; upd2(1,1,1e5+1,1,a[i]); upd1(1,1,1e5+1,a[i],cntv); ans+=qu(1,1,1e5+1,1,1e5+1); } printf("%.3Lf",ans); } int main(){ cin>>n; slv3(); return 0; }