Educational Codeforces Round 28 F. Random Query

题意:一个数列,随机选l,r,f(l,r)为l,r区间内数的种数,问f(l,r)的期望

思路:sum(每个数算出他的贡献)/(n*n),我们这只考虑l<=r ,对于当前这数字他能贡献后面的所有区间,但是对于前面的话,他只共贡献到前一个相同的数后面

           比如  1  2  3  4  2  5  6

           对于第一个2  他贡献于  (1,2) (1,3)(1,4)(1,5)(1,6)(1,7)

              (2,2) (2,3)(2,4)(2,5)(2,6)(2,7)

   对于第2个2  贡献于     (3,5)(3,6)(3,7)     (4,5)(4,6)(4,7)     (5,5)(5,6)(5,7)

  注意:爆int

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 int a[1000005];
 5 
 6 int main(){
 7     int n;
 8     ll ans=0;
 9     cin>>n;
10     for(int i=1;i<=n;i++){
11         int x;
12         scanf("%d",&x);
13         ans+=1LL*(i-a[x])*(n-i+1);
14        // cout<<(i-a[x])<<" "<<(n-i+1)<<" "<<ans<<endl;
15         a[x]=i;
16     }
17     ans=ans*2-n;
18     //cout<<ans<<endl;
19     printf("%.5f\n",ans*1.0/(1LL*n*n*1.0));
20 }

 

   

posted on 2017-09-08 16:05  hhhhx  阅读(87)  评论(0编辑  收藏  举报

导航