Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
28475 | LYLAKIOI | 【BJ】T1 | C++ | 运行超时 | 85 | 2000 MS | 86208 KB | 2828 | 2024-04-14 19:19:28 |
#include<bits/stdc++.h> #define up(i,l,r) for(int i=(l);i<=(r);++i) #define down(i,l,r) for(int i=(l);i>=(r);--i) #define p_b push_back using namespace std; typedef long long ll; const int maxn=1e6+10; inline ll read(){ ll x=0;short t=1; char ch=getchar(); while(ch<'0'||ch>'9'){ if(ch=='-')t=-1;ch=getchar(); }while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*t; } int n,a[maxn],pre[maxn],s1[maxn],s2[maxn],tp1,tp2; double pw[maxn]; double g(int l,int r){ vector<double>v; up(i,l,r)v.p_b(a[i]); sort(v.begin(),v.end()); double res=0; for(auto it:v)res=(res+it)/2; return res; } struct ST { int t[maxn][20],Log_2[maxn]; void init(){ up(i,2,n)Log_2[i]=Log_2[i>>1]+1; up(i,1,n)t[i][0]=a[i]; up(i,1,Log_2[n])up(j,1,n-(1<<i)+1)t[j][i]=max(t[j][i-1],t[j+(1<<i-1)][i-1]); }inline int qry(int l,int r){ if(l>r)return -1e9; int k=Log_2[r-l+1]; return max(t[l][k],t[r-(1<<k)+1][k]); } }T; int gpre(int x,int k){ if(T.qry(1,x-1)<=k)return 0; down(i,x-1,x-20)if(a[i]>k)return i; int l=1,r=x-20; while(l+1<r){ int mid=l+r>>1; if(T.qry(mid,x-1)>k)l=mid; else r=mid; }return l; } int gsuf(int x,int k){ if(T.qry(x+1,n)<k)return n+1; up(i,x+1,x+20)if(a[i]>=k)return i; int l=x+20,r=n; while(l+1<r){ int mid=l+r>>1; if(T.qry(x+1,mid)>=k)r=mid; else l=mid; }return r; } void slv(){ pw[0]=1;up(i,1,40)pw[i]=pw[i-1]*0.5; n=read();up(i,1,n)a[i]=read(); if(n<=100){ double res=0; up(i,1,n)up(j,i,n)res+=g(i,j); printf("%.3f",res/n/n); return;//25pts } if(n<=1500){ double res=0; up(i,1,n){ vector<double>v; up(j,i,n){ v.insert(lower_bound(v.begin(),v.end(),a[j]),a[j]); double sm=0; up(i,max(0,int(v.size())-41),int(v.size()-1))sm=(sm+v[i])/2; res+=sm; } }printf("%.3f",res/n/n); return;//15pts } T.init(); double res=0; up(i,1,n){ int x=i; tp1=tp2=0; up(j,0,30){ s1[tp1++]=x;if(!x)break; x=gpre(x,a[i]); }x=i; up(j,0,30){ s2[tp2++]=x;if(x==n+1)break; x=gsuf(x,a[i]); } up(j,0,tp1-2){ up(k,0,tp2-2){ if(j+k+1>30)break; res+=a[i]*pw[j+k+1]*(s1[j]-s1[j+1])*(s2[k+1]-s2[k]); } } }printf("%.3f",res/n/n); } int main(){ // freopen("drink.in","r",stdin); // freopen("drink.out","w",stdout); slv(); fclose(stdin); fclose(stdout); return 0; }