2020暑期牛客多校训练营第九场(C)Groundhog and Gaming Time(数学期望,线段树,逆元)
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(数学期望,线段树,逆元)相关推荐
- 2020暑期牛客多校训练营第八场(E)Enigmatic Partition(数学,二阶隔项差分)
Enigmatic Partition 原题请看这里 题目描述: 数字nnn的分区是所有数字之和等于nnn的集合. 如果分区n=a1+a2+...+amn = a_1 + a_2 + ... + a_ ...
- 2019牛客多校训练营第一场 H题 HOR 题解
题目描述: 输入描述: 输出描述: 示例1: 题解: 更多问题可关注牛客竞赛区,一个刷题.比赛.分享的社区. 传送门:https://ac.nowcoder.com/acm/contest/discu ...
- 2019牛客多校训练营第一场 E题 ABBA 题解
问题描述: 输入描述: 输出描述: 示例1: 题解: 更多问题可关注牛客竞赛区,一个刷题.比赛.分享的社区. 传送门:https://ac.nowcoder.com/acm/contest/discu ...
- 2020年牛客多校第五场C题-easy(纯组合计数不要生成函数的做法)
文章目录 description solution code description 有TTT组测试数据 对于两个长度为KKK的数列{a}\{a\}{a}和{b}\{b\}{b},满足∑i=1Kai= ...
- 2019暑假牛客多校赛第九场H.Cutting Bamboos (主席树+二分)
题意: 有n条柱子,高度为aia_iai ,我们有qqq次操作.在l到r的范围内砍yyy次,将所有的树高都砍为0,但是保证每一刀砍出来的长度(砍除树高于该高度的和)都是相同的.问你第xxx次砍的时候 ...
- 2022牛客多校联赛第九场 题解
比赛传送门 作者: fn 目录 签到题 A题 Car Show / 车展 基本题 B题 Two Frogs / 两只青蛙 进阶题 G题 Magic Spells / 魔法咒语 签到题 A题 Car S ...
- 24dian(牛客多校第三场)
24dian(牛客多校第三场) 题意: 给你n张牌,每张牌的大小为1 ~ 13,问这些牌与加减乘除任意组合(可以使用括号),且但所有的有效解在计算过程中都涉及到分数,即非整数,能否组成答案m,如果可以 ...
- 2019牛客多校第四场 I题 后缀自动机_后缀数组_求两个串de公共子串的种类数
目录 求若干个串的公共子串个数相关变形题 对一个串建后缀自动机,另一个串在上面跑同时计数 广义后缀自动机 后缀数组 其他:POJ 3415 求两个串长度至少为k的公共子串数量 @(牛客多校第四场 I题 ...
- 牛客多校第四场【B-Basic Gcd Problem】
牛客多校第四场[B-Basic Gcd Problem] 题目链接:https://ac.nowcoder.com/acm/contest/5669/B 思路:先要理解公式,多看几个数据基本就会有点想 ...
- 牛客多校第三场 B【Classical String Problem】
牛客多校第三场 B[Classical String Problem] 链接:https://ac.nowcoder.com/acm/contest/5668/B 来源:牛客网 题目描述 Given ...
最新文章
- Java中常用的类及其特点
- SSL 2311-车厢调度[栈]
- mediasoup-client 和 libmediasoupclient 指南
- C# SQLLite
- Springfox-swagger使用详解
- 镜像镜像–使用反射在运行时查看JVM内部
- 对称加密和非对称加密大概介绍和区别
- ip subnet-zero 和ip classless 的用法
- SecurityManager篇
- 【PHP学习】—PHP连接数据库(六)
- 【Python】简单实现显示图片的高斯和中值滤波效果
- ASP.NET的ASHX一般处理程序中Session为null且不能赋值
- 数据挖掘导论(完整版).Introduction.To.Data.Mining习题英文版答案
- SAP License:ERP系统简介
- NMOS和PMOS电流流向以及导通条件
- LANP源码安装注释版
- tinyMediaManager 群晖 docker
- CnSeu社工库免费查询_ip代理-golang测试纯真ip库与免费版ipip.net库比较
- 国产操作系统突破重围,中兴新支点系统宣布:30万+,并发布服务器模式
- 编解码base64、对称加密aes和非对称加密rsa