给定一个数列AA,随机选取两个值ll,rr(等概率,可以相等),进行以下操作:
- if l > r : swap(l,r)
- 对数列A中l,r区间内的数去重得到数列B
求数列BB的期望大小。
解:考虑每一个数字的贡献 ,这里要考虑对数问题,
是有 n*n个l,r 每一个不相等的L,R贡献 两次, 相等的贡献1次
(可以说是最简单的F题了)
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll maxn =1e6+10;
ll rd(){ll t;scanf("%I64d",&t);return t;}
#define en '\n'
#define mem(a,b) memset(a,b,sizeof(a))
#define pb push_back
ll pos[maxn],L[maxn];
ll n,a[maxn];
signed main() {
#ifdef swt
freopen("input2.txt","r",stdin);
#endif // local
#define int register int
cin>>n;
for(int i=1;i<=n;i++){a[i]=rd(),pos[a[i]]=0;}
for(int i=1;i<=n;i++){
L[i]=pos[a[i]]+1;
pos[a[i]]=i;
}
ll ans=0;
for(int i=1;i<=n;i++){
ans+=(i-L[i]+1)*(n-i+1);
}
ans-=n;
ans*=2;
double tem=ans+n;
tem=tem/((double)n*n);
printf("%.6f",tem);
return 0;
}