Groundhog and Gaming Time

原题请看这里

题目描述;

在PKUWC2019day2PKUWC2019day2PKUWC2019day2晚上,n{n}n个同学包括Soetdit,TX1145967673,ZPAYAUR,GroundhogSoetdit,TX1145967673,ZPAYAUR,GroundhogSoetdit,TX1145967673,ZPAYAUR,Groundhog做出了一个了不起的决定:他们准备参加一个车队,他们将分担一夜直到黎明。
那天晚上,他们一个接一个地上网。第[i][i][i]个同学将从[Li,Ri][L_i,R_i][Li​,Ri​]上线。但是有人报告了一条消息:他们的老师晚上会来。每个人都有12\frac{1} {2}21​的可能性来接收消息,而接收到该消息的人将不会在晚上上网。他们的可用游戏时间是所有游戏者都在线时。因此,他们开始思考一个问题:对他们的可用时间模的平方的期望是什么998244353{998244353}998244353
简化的问题:有n{n}n个段[Li,Ri][L_i,R_i][Li​,Ri​],每个段都有可能选择12\frac {1} {2}21​,问题是计算∣[La1,Ra1]∩[La2,Ra2]∩⋯∩[Lam,Ram]∣2| [L_ {a_1},R_ {a_1}] \cap [L_ {a_2},R_ {a_2}] \cap \cdots \cap [L_ {a_m},R_ {a_m}] | ^ 2∣[La1​​,Ra1​​]∩[La2​​,Ra2​​]∩⋯∩[Lam​​,Ram​​]∣2 modmodmod 998244353{998244353}998244353的期望值。 aia_iai​表示选定的第ith{i ^ {th}}ith个段的数量。

输入描述:

第一行包含一个整数n{n}n,表示学生人数。
接下来的n{n}n行分别包含两个整数Li,RiL_i,R_iLi​,Ri​,这表示第iii个学生的游戏时间。

输出描述:

输出一行包含答案模998244353{998244353}998244353。

样例输入:

6
2 2
1 2
1 4
1 5
3 5
3 6

样例输出:

405536771

思路:

求期望的方法有很多种,这题我们选择期望dp求期望的方法。
首先由于数据较大我们需要先对数据进行离散化,然后我们按左右端点升序排序并考虑每一段对答案的贡献。
我们设区间A出现在b条线段中,则有:
P(A)=2a−12nP(A)=\frac{2^a-1}{2^n}P(A)=2n2a−1​
应为不能全选,所以要减一。
所以:E(A)=2a−12n∗∣A∣(E(A)=\frac{2^a-1}{2^n}*|A|(E(A)=2n2a−1​∗∣A∣(听说两个‘|’还可以表示size)))
那么在所有nnn条线段中PiP_iPi​的贡献(ai(a_i(ai​条线段包含A)A)A):
∑E(Q)∗∣Pi∣\sum E(Q)*|P_i|∑E(Q)∗∣Pi​∣
=∑j(2bj−12n∗∣Qj∣)∗∣Pi∣=\sum_j(\frac{2^{b_j}-1}{2^n}*|Q_j|)*|P_i|=∑j​(2n2bj​−1​∗∣Qj​∣)∗∣Pi​∣
=∑j(2bj2n∗∣Qj∣)∗∣Pi∣−∣Pi∣∗mx=\sum_j(\frac{2^{b_j}}{2^n}*|Q_j|)*|P_i|-|P_i|*mx=∑j​(2n2bj​​∗∣Qj​∣)∗∣Pi​∣−∣Pi​∣∗mx
我们可以用线段树来维护2bi2^{b_i}2bi​,最后除以2n2^n2n并减去mxmxmx即可
具体细节请看代码。

ACACAC CodeCodeCode:

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int mod = 998244353;
const int MAXN = 1e6+5;
const int N = 1e9 + 1;
ll a[MAXN << 2], b[MAXN << 2], trl[MAXN], trr[MAXN], l[MAXN];
ll r[MAXN], lsh[MAXN], cnt, ans;
int n;
ll ksm (ll a, ll b) {ll ret = 1;while (b){if(b & 1) ret = ret * a % mod;a = a * a % mod;b >>= 1;}return ret;
}//快速幂求逆元
bool cmp1 (int x, int y){ return l[x] < l[y]; }
bool cmp2 (int x, int y){ return r[x] < r[y]; }
void build_tree (int pos, int l, int r){//建线段树 a[pos] = lsh[r + 1] - lsh[l];b[pos] = 1;if (l == r) return;int mid = l + r >> 1;build_tree (pos << 1, l, mid);build_tree (pos << 1 | 1, mid + 1, r);
}
void f (int pos, int l, int r, ll num, int x, int y){//将区间[l,r]的权值都*num if(l <= x && r >= y){a[pos] = a[pos] * num % mod;b[pos] = b[pos] * num % mod;return;}int mid = x + y >> 1;if (l <= mid) f (pos << 1, l, r, num, x, mid);if (r > mid) f (pos <<1 | 1, l, r, num, mid + 1, y);a[pos] = (a[pos << 1] + a[pos << 1 | 1]) * b[pos] % mod;//b[pos]就是lazy标记,这里可以不用下推标记。
}
int main (){lsh[1] = 0;lsh[2] = N;//添加最左最优的端点,用于处理所有线段都不选择的情况 cnt = 2;scanf ("%d", &n);for (int i = 1; i <= n; ++i){scanf("%lld%lld", l + i ,r + i);lsh[++cnt] = l[i];lsh[++cnt] = ++r[i];}sort (lsh + 1, lsh + cnt + 1);cnt = unique(lsh + 1, lsh + cnt + 1) - lsh - 1;//离散化 build_tree(1, 1, cnt - 1);//建线段树,i点的初始权值为区间[i,i+1]的长度 for (int i = 1; i <= n; ++i){l[i] = lower_bound(lsh + 1, lsh + cnt + 1, l[i]) - lsh;//映射到原值 r[i] = lower_bound(lsh + 1, lsh + cnt + 1, r[i]) - lsh;}for (int i = 1; i <= n; ++i) trl[i] = trr[i] = i;sort (trl + 1, trl + n + 1, cmp1);//线段按左端点排序 sort (trr + 1, trr + n + 1, cmp2);//线段按右端点排序 int t1 = 1, t2 = 1; for (int i = 1; i < cnt; ++i){//遍历区间[i,i+1],维护包含该区间的线段的交集的期望。这个期望通过计算所有区间的贡献和得到//从m的线段,找出a个线段包含区间[i,i+1]。计算这a个线段的交集的期望,等于每个期间的贡献总和。//a个线段,有b个线段覆盖区间[j,j+1],则区间[j,j+1]的贡献=长度*(2^b-1)/2^n。其中-1和/2^n最后再去除 for (; t1 <= n && l[trl[t1]] <= i; ++t1)//添加左端点小于等于i的线段的贡献 f(1, l[trl[t1]], r[trl[t1]] - 1, 2, 1, cnt - 1);//添加贡献,等于该区间的权值*2 for (;t2 <= n && r[trr[t2]] <= i; ++t2)//删除右端点小于等于i的线段的贡献 f(1, l[trr[t2]], r[trr[t2]] - 1, ksm(2, mod - 2), 1, cnt - 1);//添加贡献,等于该区间的权值-2 ans = (ans + a[1] * (lsh[i + 1] - lsh[i])) % mod;//计入答案,此时ans=sum(方案权值*方案数) }//注意此时统计完时,未减去考虑所有线段都不选择的情况,即贡献=长度*(2^b-1)/2^n中的-1 ans = (ans + mod - 1ll * N * N % mod) % mod;//减去所有线段都不选择的情况 for (int i = 1; i <= n; ++i)ans = ans * ksm(2, mod - 2) % mod;//除2^n,得到期望 printf("%lld\n", ans);
}

2020暑期牛客多校训练营第九场(C)Groundhog and Gaming Time(数学期望,线段树,逆元)相关推荐

  1. 2020暑期牛客多校训练营第八场(E)Enigmatic Partition(数学,二阶隔项差分)

    Enigmatic Partition 原题请看这里 题目描述: 数字nnn的分区是所有数字之和等于nnn的集合. 如果分区n=a1+a2+...+amn = a_1 + a_2 + ... + a_ ...

  2. 2019牛客多校训练营第一场 H题 HOR 题解

    题目描述: 输入描述: 输出描述: 示例1: 题解: 更多问题可关注牛客竞赛区,一个刷题.比赛.分享的社区. 传送门:https://ac.nowcoder.com/acm/contest/discu ...

  3. 2019牛客多校训练营第一场 E题 ABBA 题解

    问题描述: 输入描述: 输出描述: 示例1: 题解: 更多问题可关注牛客竞赛区,一个刷题.比赛.分享的社区. 传送门:https://ac.nowcoder.com/acm/contest/discu ...

  4. 2020年牛客多校第五场C题-easy(纯组合计数不要生成函数的做法)

    文章目录 description solution code description 有TTT组测试数据 对于两个长度为KKK的数列{a}\{a\}{a}和{b}\{b\}{b},满足∑i=1Kai= ...

  5. 2019暑假牛客多校赛第九场H.Cutting Bamboos (主席树+二分)

    题意: 有n条柱子,高度为aia_iai​ ,我们有qqq次操作.在l到r的范围内砍yyy次,将所有的树高都砍为0,但是保证每一刀砍出来的长度(砍除树高于该高度的和)都是相同的.问你第xxx次砍的时候 ...

  6. 2022牛客多校联赛第九场 题解

    比赛传送门 作者: fn 目录 签到题 A题 Car Show / 车展 基本题 B题 Two Frogs / 两只青蛙 进阶题 G题 Magic Spells / 魔法咒语 签到题 A题 Car S ...

  7. 24dian(牛客多校第三场)

    24dian(牛客多校第三场) 题意: 给你n张牌,每张牌的大小为1 ~ 13,问这些牌与加减乘除任意组合(可以使用括号),且但所有的有效解在计算过程中都涉及到分数,即非整数,能否组成答案m,如果可以 ...

  8. 2019牛客多校第四场 I题 后缀自动机_后缀数组_求两个串de公共子串的种类数

    目录 求若干个串的公共子串个数相关变形题 对一个串建后缀自动机,另一个串在上面跑同时计数 广义后缀自动机 后缀数组 其他:POJ 3415 求两个串长度至少为k的公共子串数量 @(牛客多校第四场 I题 ...

  9. 牛客多校第四场【B-Basic Gcd Problem】

    牛客多校第四场[B-Basic Gcd Problem] 题目链接:https://ac.nowcoder.com/acm/contest/5669/B 思路:先要理解公式,多看几个数据基本就会有点想 ...

  10. 牛客多校第三场 B【Classical String Problem】

    牛客多校第三场 B[Classical String Problem] 链接:https://ac.nowcoder.com/acm/contest/5668/B 来源:牛客网 题目描述 Given ...

最新文章

  1. Java中常用的类及其特点
  2. SSL 2311-车厢调度[栈]
  3. mediasoup-client 和 libmediasoupclient 指南
  4. C# SQLLite
  5. Springfox-swagger使用详解
  6. 镜像镜像–使用反射在运行时查看JVM内部
  7. 对称加密和非对称加密大概介绍和区别
  8. ip subnet-zero 和ip classless 的用法
  9. SecurityManager篇
  10. 【PHP学习】—PHP连接数据库(六)
  11. 【Python】简单实现显示图片的高斯和中值滤波效果
  12. ASP.NET的ASHX一般处理程序中Session为null且不能赋值
  13. 数据挖掘导论(完整版).Introduction.To.Data.Mining习题英文版答案
  14. SAP License:ERP系统简介
  15. NMOS和PMOS电流流向以及导通条件
  16. LANP源码安装注释版
  17. tinyMediaManager 群晖 docker
  18. CnSeu社工库免费查询_ip代理-golang测试纯真ip库与免费版ipip.net库比较
  19. 国产操作系统突破重围,中兴新支点系统宣布:30万+,并发布服务器模式
  20. 编解码base64、对称加密aes和非对称加密rsa

热门文章

  1. python的spider程序下载_Python Spider
  2. html动态工艺流程,化工工艺动态流程图制作软件
  3. Geometric Transformation(几何变换)
  4. for循环后面的分号
  5. auto.js启动app
  6. 【机器学习】可决系数R^2和MSE,MAE,SMSE
  7. 详解redis高级特性和工作原理
  8. learning and evaluating representations for deep one-class classification
  9. php下对港澳台身份证进行验证
  10. 【思维导图】本博客技术思维导图