提交时间:2024-04-14 14:04:46

运行 ID: 28318

#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]; void pu(int p){ val[p]=val[ls]+val[rs]; }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; }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); }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); }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]<<' '; }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[4000050]; void pushup(int p){ c[p]=max(c[ls],c[rs]); }void build(int p,int l,int r){ if(l==r){ c[p]=a[l]; return ; }build(ls,l,mid);build(rs,mid+1,r); pushup(p); }int ask(int p,int l,int r,int x,int v){ if(l==r){ if(x<l) return 0; if(c[p]>v) return l; else return 0; }if(x<l)return 0; if(x<=mid) return ask(ls,l,mid,x,v); int res=ask(rs,mid+1,r,x,v); if(res) return res; else return ask(ls,l,mid,x,v); } void slv3(){ for(int i=1;i<=n;i++) cin>>a[i]; bd(1,1,1e5+1);build(1,1,n); 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<=30){ d1++; int las=it; it=ask(1,1,n,it-1,a[i]); cntv+=now/n/n*(las-it); now/=2; } 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; }