提交时间:2024-04-14 14:18:30

运行 ID: 28334

#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[2200050][30]; 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]=c[i+(1<<j)][j-1]; }for(int i=2;i<=n;i++) lg[i]=lg[i/2]+1; }int q(int l,int r){ return max(c[l][lg[r-l+1]],c[r-lg[r-l+1]-1][lg[r-l+1]]); }int BS(int l,int r,int x){ while(l<r){ 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++) cin>>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<=30){ d1++; int las=it; it=BS(1,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; }