数学期望+区间标记

Posted sissi-hss

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数学期望+区间标记相关的知识,希望对你有一定的参考价值。

https://vjudge.net/contest/237352#problem/G

题意:有n个玩具,编号为1到n,其中编号为i的玩具价值为wi。有m个区间,其中第i个区间为[li,ri],随机选取了3个互不相同的数i,j,k(1i<j<km),将所有足 max(li,lj,lk)xmin(ri,rj,rk)的编号为x的玩具取出,求取出的玩具的有价值之和的期望是多少。

解法:考虑每一个点,对结果的影响,如果一个点包括了x个区间,那么,就有C(x,3)个w[i]在分子上,分母为C(m,3);所以最终的问题就是要求每个点所在的区间数,用区间标记的方法实现。注意不要爆long long。

注意判断判断结果为整数,分数,以及0的情况。

 1 //#include<bits/stdc++.h>
 2 #include <iostream>
 3 #include <algorithm>
 4 #include <cstdio>
 5 #include <cstring>
 6 #include <string>
 7 #include <cmath>
 8 #include <cstdlib>
 9 #include <queue>
10 #include <stack>
11 #include <map>
12 #include <vector>
13 #include <set>
14 #include <bitset>
15 #include <iomanip>
16 #define ms(a, b) memset(a, b, sizeof(a));
17 using namespace std;
18 typedef long long LL;
19 typedef pair<int, int> pii;
20 const int INF = 0x3f3f3f3f;
21 const int maxn = 5e4 + 10;
22 const int MAXN = 2e4 + 10;
23 const double eps = 1e-8;
24 const int mod = 1e9 + 7;
25 int n, m;
26 int w[maxn], f[maxn];
27 
28 LL C(LL k) {
29     return k * (k-1) * (k-2) / 6;
30 }
31 
32 LL gcd(LL a, LL b) {
33     while(b) {
34         LL tmp = a % b;
35         a = b;
36         b = tmp;
37     }
38     return a;
39 }
40 
41 void solve() {
42 
43     return ;
44 }
45 
46 
47 int main() {
48 #ifdef local
49     freopen("case.in", "r", stdin);
50 //    freopen("case.out", "w", stdout);
51 #endif
52 //    ios::sync_with_stdio(false);
53 //    cin.tie(0);
54     int T;
55     scanf("%d", &T);
56     while(T--) {
57         scanf("%d%d", &n, &m);
58         for(int i = 1; i <= n; i++)
59             scanf("%d", &w[i]);
60         ms(f, 0);
61         for(int i = 0; i < m; i++) {
62             int l, r;
63             scanf("%d%d", &l, &r);
64             f[l]++;
65             f[r+1]--;
66         }
67         LL cnt = 0, up = 0;
68         for(int i = 1; i <= n; i++) {
69             cnt += f[i];
70             if(cnt >= 3) up += w[i] * C(cnt);
71         }
72         LL down = C(m);
73         LL div = gcd(up, down);
74         if(div > 0) {
75             up /= div;
76             down /= div;
77             if(down == 1) printf("%lld
", up);
78             else printf("%lld/%lld
", up, down);
79         }
80         else printf("0
");
81     }
82 //    solve();
83     return 0;
84 }

 

以上是关于数学期望+区间标记的主要内容,如果未能解决你的问题,请参考以下文章

LA 4731 蜂窝网络

概率论中均匀分布的数学期望和方差该怎么求啊?

神奇脑洞题解——HAOI2012高速公路(数学期望,线段树)

jxoi2018游戏 组合数学

整理数学期望和概率DP

CSS 显示代码片段:使用PRE标记包裹长行