题解
题意:给n个数,任取一个区间,端点可以重合,每个区间被取到的概率是一样的,设每个区间的价值是其不同的数的个数,问整段区间的价值期望
学习来源 · 大佬博客直通车
记记笔记…
在这道题里,
期望 = 总价值 / 区间总数,
因为 和 是等概率随机的,所以区间也是等概率的,
所以期望 区间价值*(区间概率),
接着是计算总价值:
总共有个 ,可以知道如果是不同的 ,贡献要算两次,而相同的贡献只需算一次
设前 个数里总贡献为 ,
- 假设第 个数字在前面的区间里没有出现过,
则第 个数会对区间 都有+1的贡献, - 假设第 个数字在前面第 个位置出现过,
则第 个数对前面 不会造成影响,对剩余的区间都有+1的影响
总结一下有如下公式:
,其中pre[i]为第i个数之前出现的位置
又因为区间端点可以交换,每个数字的贡献为 ,减1是当l、r相同的时候贡献只要算一次就够了
#include <bits/stdc++.h>
using namespace std;
typedef double ll;
const int N = 1e6 + 10;
ll f[N];//范围会爆int
int n,m, k;
int pre[N],a[N];
int main() {
ios::sync_with_stdio(0);
cin>>n;
double ans=0.0;
for (int i = 1; i <= n; ++i) {
cin>>a[i];
f[i]=f[i-1]+i-pre[a[i]];
ans+=2.0*f[i]-1;
pre[a[i]]=i;
}
printf("%.6f\n",ans/(1.0*n*n) );
return 0;
}
来源:CSDN
作者:Zaller
链接:https://blog.csdn.net/Yubing792289314/article/details/104576537