牛客网暑期ACM多校训练营(第五场) F - take —— 期望+树状数组+逆元
看到一篇好的博客特意转出来观摩大佬:转:https://blog.csdn.net/greybtfly/article/details/81413526
题目大意:
给n个箱子排成一排,从头到尾按顺序依次开箱子,第i个箱子都有概率pi开出size为di的钻石。
一开始手中是没有钻石的,如果打开箱子后钻石的size要大于手中的钻石,就丢掉手中的钻石换成箱子中的钻石。
问:丢掉钻石的个数(交换的次数)期望是多少。(有点像狗熊掰棒子,咳咳)
思路:
由概率知识可以知道,选择每个箱子时所有的情况都是独立的(不会的话问高中数学老师不要问我,我也证明不了)
所以期望E=∑(所有箱子打开时交换的期望),由概率论知识,设事件为A,期望为E(A ),发生一次为P(A),发生一次对期望的贡献为F(A),有E(A)=P(A)*F(A)。本题显然发生一次交换事件对期望的贡献为F(A)=1;所以有
E(A)=P(A);
所以,E=∑(所有箱子打开时交换的期望)=∑( 所有箱子打开时交换的概率);
然后题目就转化为求箱子打开时发生交换的概率。
我们很容易知道,手中钻石size大小一定是递增的,所以打开第i个箱子时,发生交换的条件是之前没有拿到更大的钻石(如果之前的钻石更大,也就是手中的钻石更大,肯定不能丢掉手中的大钻石,所谓丢了西瓜捡了芝麻....).
总结一下,之前所有大于它的箱子不能开:1~i-1个箱子中,钻石大于第i个的箱子,不打开的概率的乘积。要发生交换,第i个箱子也得打开,就再乘以pi。
设pi为打开第i个箱子的概率,bi为第i个箱子的钻石大小。
所以 Pi=pi*π(1-pj), j∈{ j是正数|1<=j<=i-1 且 bj>bi };
E=∑ei=∑Pi
期望(数学部分)求解完毕。
但这还没结束。由于结果显然超出了long long 的数据范围,且结果对mod=998244353取余后输出。我们想到同余定理。
(a±b)%mod=(a%mod±b%mod+mod)%mod
a*b*c%mod=a*b%mod*c%mod
但是本题有除法,(因为要除以100)
所以要用到离散数学中的逆元(运算为%mod,要注意mod不同逆元也不同)
设%mod的逆元为inv
有a/b%mod=a*inv%mod (不考虑小数)
求逆元用扩展欧几里得做(听说也有别的方法)。我直接抄板子了,其实我也不清楚求逆元的原理
这还没完
公式中要求前i项大于b的概率连乘积。而n数据范围是1e5.所以,不可能用暴力的方法求解。要用树状数组(或者线段树)
我们离线处理需求,由于我们只需要前i个比当前箱子钻石大的概率连乘积,所以我们将箱子按照钻石大小从大到小排序(要记录好箱子本来的位置,这里可以用离散化O(nlogn),也可以直接保留映射O(n),我选择第二种)。
按照从大到小的顺序,依次加入树状数组,使用树状数组查询前i个连乘积(注意取模)。
#include<bits/stdc++.h>
using namespace std; #define ll long long
const ll mod = ;
const ll maxn = 4e5+;
ll tree[maxn],n; ll lowbit(ll x)
{
return x&-x;
}
void update(ll i , ll x)
{
while(i<=n)
{
tree[i]*=x;
tree[i]%=mod;
i+=lowbit(i);
}
}
ll sum(ll x)
{
ll Sum=;
while(x>)
{
Sum*=tree[x];
Sum%=mod;
x-=lowbit(x);
}
return Sum;
}
ll inv(ll a , ll m)
{
if(a==) return ;
return inv(m%a,m)*(m-m/a)%m;
}
struct no
{
ll p,v,i;
}co[maxn];
bool cmp(no a , no b)
{
return a.v>b.v;
}
int main()
{
ll imod=inv(,mod);
ll e=,i,j,k,t;
cin>>n;
for( i= ; i<maxn ; i++) tree[i]=;
for(i= ; i<=n ; i++)
{
scanf("%lld%lld",&co[i].p,&co[i].v);
co[i].p*=imod;
co[i].p%=mod;
co[i].i=i;
}
sort(co+,co++n,cmp);
for(int i= ; i<=n ; i++)
{
e+=sum(co[i].i-)*co[i].p%mod;
e%=mod;
update(co[i].i,(-co[i].p+mod)%mod);
}
cout<<e<<endl;
}
牛客网暑期ACM多校训练营(第五场) F - take —— 期望+树状数组+逆元的更多相关文章
- 牛客网 暑期ACM多校训练营(第二场)A.run-动态规划 or 递推?
牛客网暑期ACM多校训练营(第二场) 水博客. A.run 题意就是一个人一秒可以走1步或者跑K步,不能连续跑2秒,他从0开始移动,移动到[L,R]的某一点就可以结束.问一共有多少种移动的方式. 个人 ...
- 牛客网 暑期ACM多校训练营(第一场)A.Monotonic Matrix-矩阵转化为格子路径的非降路径计数,Lindström-Gessel-Viennot引理-组合数学
牛客网暑期ACM多校训练营(第一场) A.Monotonic Matrix 这个题就是给你一个n*m的矩阵,往里面填{0,1,2}这三种数,要求是Ai,j⩽Ai+1,j,Ai,j⩽Ai,j+1 ,问你 ...
- 2018牛客网暑期ACM多校训练营(第二场)I- car ( 思维)
2018牛客网暑期ACM多校训练营(第二场)I- car 链接:https://ac.nowcoder.com/acm/contest/140/I来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 ...
- 牛客网暑期ACM多校训练营(第一场) - J Different Integers(线段数组or莫队)
链接:https://www.nowcoder.com/acm/contest/139/J来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 524288K,其他语言1048 ...
- 牛客网暑期ACM多校训练营(第九场) A题 FWT
链接:https://www.nowcoder.com/acm/contest/147/A来源:牛客网 Niuniu has recently learned how to use Gaussian ...
- 牛客网暑期ACM多校训练营(第九场)D
链接:https://www.nowcoder.com/acm/contest/147/D来源:牛客网 Niuniu likes traveling. Now he will travel on a ...
- 牛客网暑期ACM多校训练营(第二场)B discount
链接:https://www.nowcoder.com/acm/contest/140/B来源:牛客网 题目描述 White Rabbit wants to buy some drinks from ...
- 2018牛客网暑期ACM多校训练营(第一场)D图同构,J
链接:https://www.nowcoder.com/acm/contest/139/D来源:牛客网 同构图:假设G=(V,E)和G1=(V1,E1)是两个图,如果存在一个双射m:V→V1,使得对所 ...
- 牛客网暑期ACM多校训练营(第二场) I Car 思维
链接:https://www.nowcoder.com/acm/contest/140/I来源:牛客网 White Cloud has a square of n*n from (1,1) to (n ...
- 牛客网暑期ACM多校训练营(第二场) D money 思维
链接:https://www.nowcoder.com/acm/contest/140/D来源:牛客网 White Cloud has built n stores numbered from 1 t ...
随机推荐
- 【BASIS系列】SAP 中查看account登陆次数及时间的情况
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[BASIS系列]SAP 中查看account登 ...
- Mac017--Jenkins 持续集成
Jenkins 是一个开源项目,提供了一种易于使用的持续集成系统,使开发者从繁杂的集成中解脱出来,专注于更为重要的业务逻辑实现上.同时 Jenkins 能实施监控集成中存在的错误,提供详细的日志文件和 ...
- lambda表达式(1)
转自:http://www.cnblogs.com/knowledgesea/p/3163725.html 简化了匿名委托的使用,让你让代码更加简洁,优雅.据说它是微软自c#1.0后新增的最重要的功能 ...
- Vue 基础 day06 webpack 3.x 结合vue
在普通页面使用 render 函数渲染组件 var login = { template: '<h3>login</h3>' } var vm = new Vue({ // c ...
- [Python3 填坑] 012 字典的遍历在 Python2 与 Python3 中区别
目录 1. print( 坑的信息 ) 2. 开始填坑 2.1 Python2 中字典的遍历 2.2 Python3 中字典的遍历 2.3 结论 1. print( 坑的信息 ) 挖坑时间:2019/ ...
- vue2.0 watch里面的 deep和immediate作用
deep,默认值是 false,代表是否深度监听.immediate:true代表如果在 wacth 里声明了之后,就会立即先去执行里面的handler方法,如果为 false就跟我们以前的效果一样, ...
- HDU-1754 I Hate It(线段树,区间最大值)
很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问.当然,老师 ...
- k8s结合helm部署
一.安装Helm helm教程以及安装可以参考这篇文章 二.Heml说明 常见的helm模板如下 myapp - chart 包目录名 ├── charts - 依赖的子包目录,里面可以包含多个依赖的 ...
- Flutter 初探 -
flutter 安装 经过许久的关注,及最近google算是真正地推行flutter时,加上掘金小册也有相应的教程,我知道自己得跟着这一波潮流学习了,不然迟早会面临着小程序的危(大家都会了就你不会), ...
- 微信小程序的短信接口
使用聚合数据 (网址) https://www.juhe.cn/docs? 注册部分略! 这是登录部分的. 一: 二.我的接口