[cf 1264 C] Beautiful Mirrors with queries
题意:
你有$n$个魔镜,第$i$个魔镜有$p_{i}$的概率说你美。
从第1天开始,你会依次询问魔镜$1-n$你美不美。
若第$i$个魔镜说你美则你明天会继续询问第$i+1$个魔镜。
否则你明天会从该魔镜前面第一个复活点魔镜开始询问。初始时只有魔镜1是复活点。
当第$n$个魔镜说你美的时候你会开心的一批。
现在有$q$次操作,每次操作修改一个魔镜使其成为/不成为复活点。
每次操作之后请你求出期望多少天你能开心的一批。
$n,q\leq 2\times 10^{5}$。
题解:推出一段区间答案的简单表示形式即可。
一开始想复杂了,用期望的线性性推了个式子发现做不了。
实际上我们只需要根据最简单的思路推式子即可。
设$E_{i}$为从$i$走到$n$的期望天数。
则有$E_{i}=p_{i}\times(1+E_{i+1})+(1-p_{i})\times(1+E_{1})$。
手动消元一下$E_{1}$,得到$E_{1}=\frac{1}{p_{n}}+\frac{1}{p_{n}p_{n-1}}+\cdots +\frac{1}{p_{n}p_{n-1}\cdots p_{1}}$。
那么考虑复活点这件事,容易发现整个序列被复活点分成了若干个区间。
每个区间是独立的。即$ans=\sum{E_{[f_{i-1},f_{i}]}}$。
那么我们考虑$E_{[l,r]}$如何计算。
推广上面那个式子,得到$E_{[l,r]}=\frac{1}{p_{r}}+\frac{1}{p_{r}p_{r-1}}+\cdots +\frac{1}{p_{r}p_{r-1}\cdots p_{l}}$。
我们设$s_{i}$为$p_{1}p_{2}\cdots p_{i}$,那么有
$E_{[l,r]}=\frac{(p_{r-1}p_{r-2}\cdots p_{l}+p_{r-2}p_{r-3}\cdots p_{l}+\cdots +p_{l}+1)}{\frac{s_{r}}{s_{l-1}}}$。
我们再设$ss_{i}=s_{1}+s_{2}+\cdots +s_{i}$,那么有
$E_{[l,r]}=\frac{\frac{(ss_{r-1}-ss_{l-1})}{s_{l-1}}+1}{\frac{s_{r}}{s_{l-1}}}$。
于是只需要用一个$set$维护复活点即可做到$O(nlogn)$。
代码:
#include<bits/stdc++.h>
#define maxn 200005
#define maxm 500005
#define inf 0x7fffffff
#define mod 998244353
#define ll long long
#define debug(x) cerr<<#x<<": "<<x<<endl
#define fgx cerr<<"--------------"<<endl
#define dgx cerr<<"=============="<<endl using namespace std;
ll s[maxn],ss[maxn];
set<int> st; inline ll read(){
ll x=,f=; char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-;
for(;isdigit(c);c=getchar()) x=x*+c-'';
return x*f;
} inline ll power(ll a,ll b){ll ans=;while(b) ans=(b&)?ans*a%mod:ans,a=a*a%mod,b>>=;return ans;}
inline ll inv(ll x){return power(x,mod-);}
inline ll mo(ll x){return x>=mod?x-mod:x;}
inline ll calc(ll l,ll r){return (mo(ss[r-]-ss[l-]+mod)*inv(s[l-])%mod+)*inv(s[r]*inv(s[l-])%mod)%mod;} int main(){
ll n=read(),q=read(); s[]=;
for(ll i=;i<=n;i++){
ll x=read()*inv()%mod;
s[i]=s[i-]*x%mod,ss[i]=(ss[i-]+s[i])%mod;
}
st.insert(),st.insert(n+);
ll ans=(ss[n-]+)%mod*inv(s[n])%mod;
while(q--){
int x=read();
set<int>::iterator it=st.lower_bound(x);
if(*it==x){
int l=*(--it);it++;int r=(*(++it));//cout<<1<<":"<<l<<" "<<r<<endl;
ans=mo(ans-calc(l,x-)+mod),ans=mo(ans-calc(x,r-)+mod),ans=mo(ans+calc(l,r-)),st.erase(x);
}
else{
int l=*(--it);it++;int r=(*it);//cout<<2<<":"<<l<<" "<<r<<endl;
ans=mo(ans-calc(l,r-)+mod),ans=mo(ans+calc(l,x-)),ans=mo(ans+calc(x,r-)),st.insert(x);
}
printf("%I64d\n",ans);
}
return ;
}
C
[cf 1264 C] Beautiful Mirrors with queries的更多相关文章
- Codeforces - 1264C - Beautiful Mirrors with queries - 概率期望dp
一道挺难的概率期望dp,花了很长时间才学会div2的E怎么做,但这道题是另一种设法. https://codeforces.com/contest/1264/problem/C 要设为 \(dp_i\ ...
- Codeforces 1264C/1265E Beautiful Mirrors with queries (概率期望、DP)
题目链接 http://codeforces.com/contest/1264/problem/C 题解 吐槽:为什么我赛后看cf的题就经常1h内做出Div.1 C, 一打cf就动不动AB题不会啊-- ...
- Codeforces Round #604 (Div. 1) - 1C - Beautiful Mirrors with queries
题意 给出排成一列的 \(n\) 个格子,你要从 \(1\) 号格子走到 \(n\) 号格子之后(相当于 \(n+1\) 号格子),一旦你走到 \(i+1\) 号格子,游戏结束. 当你在 \(i\) ...
- Codeforces Round #604 (Div. 2) E. Beautiful Mirrors
链接: https://codeforces.com/contest/1265/problem/E 题意: Creatnx has n mirrors, numbered from 1 to n. E ...
- CF 55 D. Beautiful numbers
D. Beautiful numbers 链接 题意: 求[L,R]中多少个数字可以整除它们的每一位上的数字. 分析: 要求模一些数字等于0等价于模它们的lcm等于0,所以可以记录当前出现的数字的lc ...
- cf B Very Beautiful Number
题意:给你两个数p和x,然后让你找出一个长度为p的数,把它的最后移到最前面之后得到的数是原来数字的x倍,有很多这样的数取最小. 思路:枚举最后一位,然后就可以推出整个的一个数,然后比较得到的数的第一个 ...
- CF Educational Round 23 F.MEX Queries
写了3小时 = =.这两天堕落了,昨天也刷了一晚上hihocoder比赛,还爆了零.之后得节制点了,好好准备考研.. 首先很容易想到 压缩数据 + 线段树 然后对于Pushdown真很难写..需要牵涉 ...
- [Codeforces 1265E]Beautiful Mirrors
Description 题库链接 一共有 \(n\) 个关卡,你初始在第一个关卡.通过第 \(i\) 个关卡的概率为 \(p_i\).每一轮你可以挑战一个关卡.若通过第 \(i\) 个关卡,则进入第 ...
- Codeforces Round #604 (Div. 2) E. Beautiful Mirrors 题解 组合数学
题目链接:https://codeforces.com/contest/1265/problem/E 题目大意: 有 \(n\) 个步骤,第 \(i\) 个步骤成功的概率是 \(P_i\) ,每一步只 ...
随机推荐
- Vim操作:打开文件
1.打开文件并定位到某一行 vim +20 vendor/laravel/framework/src/Illuminate/Support/Facades/Facade.php # 定位至第20行 2 ...
- 【初识Spring】对象(Bean)实例化及属性注入(注解方式)
通过xml的方式进行对象的实列化或属性注入或许有一些繁琐,所以在开发中常用的方式更多是通过注解的方式实现对象实例化和属性注入的. 开始之前 1.导入相关的包(除了导入基本的包还要导入aop的包): 创 ...
- Django框架操作数据库的两种方式
Django操作数据库的前提操作是成功连接数据库,详情见上篇:https://www.cnblogs.com/kristin/p/10791358.html Django查询数据库的方式一 from ...
- SQL 触发器 新建时删除相同数据
--create alter trigger [dbo].[trigger_sqsj] on [dbo].[lctnrcrd] after INSERT as BEGIN ) id ),dlr,) d ...
- Python环境安装与基础语法(2)——数据类型、标识符、语言分类
高级语言发展 结构化语言:以顺序(步骤化),分支,循环描述问题 面向对象语言:接近人类的认知,万物抽象成对象,对象间的关系抽象成类和继承 程序=数据结果+算法 Python解释器 CPython:由C ...
- 其它综合-CentOS7 解决忘记root密码
CentOS7 解决忘记root密码 1.重启 长时间不用的 CentOS 机器再次开机的时候忽然忘记了密码,总不能就重装一台吧,还有好多服务在机器上,于是决定重置 root 的密码. 如果是已经开启 ...
- 网关地址和网关IP是什么,他们有什么关系?
2019-12-19 新用户541... 转自 小糊涂大神 修改 通常情况下,一台终端上网必须设置IP地址.子网掩码.网关IP地址,终端IP地址与网关IP属于同一个网段,网关IP是终端访问外网 ...
- 201871010112-梁丽珍《面向对象程序设计(java)》第十四周学习总结
项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...
- HttpRequest对象
在面向对象的语言中,有种“万物皆对象”的说法.在上篇文章中介绍了HttpRuntime类,在该类收到请求之后,立即通过HttpWorkerRequest工作者对象对传递的参数进行分析和分解,创建方便网 ...
- odoo fields_view_get
odoo fields_view_get创建动态视图方法 odoo fields_view_get方法是一个比较有用比较灵活的广泛,如果使用得当,可以做到一些常规方法无法实现的功能,本文列举若干种用 ...