题解 P6708 【[CCC2020] Josh's Double Bacon Deluxe】
我们考虑第一个乱选的人,如果他选到的是他本来喜欢的汉堡(
若不然,假设他选到的汉堡是
记
我们就可以得到一个
稍加观察我们发现,若把
从后往前遍历所有
代码(因为对
#include<cstdio>
#include<algorithm>
#define N 1000005
#define M 500005
#define lf double
int n,a[N];
int m,r[M],pos[M];
lf f[M],sum;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
r[a[i]]=i;
m=std::max(m,a[i]);
}
if(a[1]==a[n]){
puts("1");
return 0;
}
std::sort(r+1,r+m+1);
for(int i=1;i<=m;i++)
pos[a[r[i]]]=i;
r[0]=1;
sum=1;
for(int i=m-1,j=n;i>=0;i--){
if(r[i]==0)
continue;
while(j>r[i]){
sum+=(a[j]==a[1]?1:f[pos[a[j]]]);
j--;
}
f[i]=sum/(n-r[i]+1);
}
printf("%.15lf\n",f[0]);
}