提交时间:2024-04-14 16:43:54
运行 ID: 28432
#include<iostream> #include<algorithm> #include<cmath> #include<complex> #include<set> #include<ctime> using namespace std; inline int read(){ int i=getchar(),r=0; while(i<'0'||i>'9')i=getchar(); while(i>='0'&&i<='9')r=(r<<1)+(r<<3)+(i^48),i=getchar(); return r; } const int N=1000100,lim=10; #define timeMS (clock()*1000/CLOCKS_PER_SEC) int n,a[N]; void init(){ cin>>n; for(int i=1;i<=n;i++)a[i]=read(); } int id[N]; inline bool cmp(int x,int y){return (a[x]==a[y]&&x<y)||a[x]<a[y];} int nex[N],lst[N]; inline int get_nex(int x){return nex[x]==x?x:nex[x]=get_nex(nex[x]);} inline int get_lst(int x){return lst[x]==x?x:lst[x]=get_lst(lst[x]);} signed main(){ init(); for(int i=1;i<=n;i++)nex[i]=lst[i]=i; for(int i=1;i<=n;i++)id[i]=i; sort(id+1,id+n+1,cmp); double ans=0; for(int I=1;I<=n;I++){int i=id[I]; int L=0; int now=i; double F1=0,F2=0; double t=1; do{ int nex=get_nex(now)+1; F1+=t*(now-nex); now=nex,L++,t/=2; if(L>lim)break; }while(now<=n); int R=0; now=i; t=1; do{ int nex=get_lst(now)-1; F2+=t*(nex-now); now=nex,R++,t/=2; if(R>lim)break; }while(now>0); ans+=F1*F2/2*a[i]/n/n; nex[i-1]=i; lst[i+1]=i; } ans=ans; printf("%.9f",ans); // cerr<<timeMS; return 0; }