题目大意

有\(n\)(\(n\leq200\))个非负整数\(m_1,m_2,...,m_n\)(\(\forall i\in[1,n],m_i\leq100\)),有\(q\)(\(q\leq2*10^5\))个操作,每个操作是以下两种之一:
(1)给出位置\(x\),概率\(q\),若\(m_x\)大于0,则有\(q\)的概率将\(m_x\)减一;若\(m_x\)为0,则不进行任何操作
(2)给出一个数\(k\)和\(k\)个不重复的位置\(d_1,d_2,...d_k\),在\(m_{d_1},...,m_{d_k}\)中随机选一个正数,求选中位置\(d_1,...,d_k\)的概率各是多少,这种操作不超过1000个
最后输出每个位置上的数在经过\(q\)个操作后期望分别是多少。

题解

设\(p_{i,j}\)表示现在第\(i\)个数还剩\(j\)的概率是多少
在进行操作前,\(p_{i,m_i}=1\),其他的\(p_{i,j}\)都为0
如果是操作(1),\(x\)有\(q\)的概率减一,也就是说,\(p_{x,j}\)有\(q\)的概率转移到\(p_{x,j-1}\),\(p_{x,j}\)有\(1-q\)的概率转移到\(p_{x,j}\),特殊地,\(p_{x,0}\)有\(1\)的概率转移到\(p_{x,0}\)
如果是操作(2),设\(g_{i,j}\)表示在不考虑\(d_i\)时,有\(j\)个数是正数的概率,那么\(d_i\)是正数且被选中的概率就是\[(1-p_{d_i,0})*(\sum_{j=0}^{k-1}g_{i,j}*\frac{1}{k+1})\]这样,在已知\(g\)的情况下,就可以在\(\Theta(k^2)\)的时间内求出一次(2)操作的答案了
那么\(g\)该怎么求呢?设\(f_{i,j}\)表示考虑位置\(d_1,...,d_i\)位置上的数,其中正数有\(j\)个
初始\(f_{0,0}=1\),转移为\[ f_{i,j} \begin{cases} f_{i-1,j-1}*(1-p_{d_i,0})+f_{i-1,j}*p_{d_i,0} & \text {j>0} \\ f_{i-1,j}*p_{d_i,0} & \text{j=0} \end{cases} \]
这样就能求出在这\(k\)个位置中,有\(j\)个位置上的数是正数的概率了,但是该如何把这个某个位置上的数的影响去掉,求出\(g\)呢?
重新dp一遍想必是不可能的,那样对于每个\(d_i\)都要重新进行\(\Theta(k^2)\)的dp,一次(2)操作就是\(\Theta(k^3)\),时间超限了
能否用\(f\)和\(p\)进行一些变化求出\(p\)呢?会发现在已知\(f_{i+1,0},...,f_{i+1,k}\)和\(p_{d_{i+1},0}\)时,是可以求出\(f_{i,0},...,f_{i,k}\)的
先把推出\(f_{i+1,0},...,f_{i+1,k}\)的所有式子写出来:
\(f_{i+1,0}= f_{i,0}*p_{d_{i+1},0}\)
\(f_{i+1,1}= f_{i,0}*(1-p_{d_{i+1},0})+f_{i,1}*p_{d_{i+1},0}\)
\(...\)
\(f_{i+1,k}= f_{i,k-1}*(1-p_{d_{i+1},0})+f_{i,k}*p_{d_{i+1},0}\)
再把\(f_{i,0},...,f_{i,k}\)拿到左边:
\(f_{i,0}= \frac{f_{i+1,0}}{p_{d_{i+1},0}}\)
\(f_{i,1}= \frac{f_{i+1,1}-f_{i,0}*(1-p_{d_{i+1},0})}{p_{d_{i+1},0}}\)
\(...\)
\(f_{i,k}= \frac{f_{i+1,k}-f_{i,k-1}*(1-p_{d_{i+1},0})}{p_{d_{i+1},0}}\)
特殊地,当\(p_{d_{i+1},0}=0\)时,\(f_{i,j}=f_{i+1,j+1}\)
这个变化的复杂度是\(\Theta(k)\)的
\(f_{i+1,...}\)本来是\(d_1,..,d_{i+1}\)的答案,经过变化后,\(f_{i,...}\)是\(d_1,..,d_{i}\)的答案,这相当于把\(d_{i+1}\)位置上的数的影响从\(f_{i+1,...}\)中去掉
那么\(g_{i,...}\)可以看成把\(d_i\)位置上的数的影响从\(f_{n,...}\)中删去,就可以进行相似的变化
当\(p_{d_{i+1},0}\neq 0\)时,
\(g_{i,0}= \frac{f_{n,0}}{p_{d_{i+1},0}}\)
\(g_{i,1}= \frac{f_{n,1}-g_{i,0}*(1-p_{d_{i+1},0})}{p_{d_{i+1},0}}\)
\(...\)
\(g_{i,k}= \frac{f_{n,k}-g_{i,k-1}*(1-p_{d_{i+1},0})}{p_{d_{i+1},0}}\)
当\(p_{d_{i+1},0}=0\)时,\(g_{i,j}=f_{g,j+1}\)

代码
#include<algorithm>
#include<cmath>
#include<complex>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<iomanip>
#include<iostream>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<vector>
#define rep(i,x,y) for(register int i=(x);i<=(y);++i)
#define dwn(i,x,y) for(register int i=(x);i>=(y);--i)
#define maxn 210
#define maxm 110
#define LL long long
using namespace std;
int read()
{int x=0,f=1;char ch=getchar();while(!isdigit(ch)&&ch!='-')ch=getchar();if(ch=='-')f=-1,ch=getchar();while(isdigit(ch))x=(x<<1)+(x<<3)+ch-'0',ch=getchar();return x*f;
}
void write(int x)
{if(x==0){putchar('0');return;}int f=0;char ch[20];if(x<0)putchar('-'),x=-x;while(x)ch[++f]=x%10+'0',x/=10;while(f)putchar(ch[f--]);return;
}
const LL mod=998244353;
int inv[maxn],n,q,m[maxn],p[maxn][maxm],f[2][maxn],g[maxn],id[maxn],yes[maxn],no[maxn],num;
int qp(int x,int y){int ans=1;while(y){if(y&1)ans=(LL)ans*(LL)x%mod;x=(LL)x*(LL)x%mod,y>>=1;}return ans;}
void work()
{rep(i,1,num)f[0][i]=0;f[0][0]=1;rep(i,0,num-1){int now=i&1,nxt=now^1;rep(j,0,i){f[nxt][j+1]=((LL)f[nxt][j+1]+(LL)f[now][j]*(LL)yes[i+1]%mod)%mod;f[nxt][j]=((LL)f[nxt][j]+(LL)f[now][j]*(LL)no[i+1]%mod)%mod;f[now][j]=0;}}rep(i,1,num){int res=0,fdie=qp(no[i],mod-2); if(no[i]!=0){g[0]=(LL)f[num&1][0]*(LL)fdie%mod; rep(j,1,num-1)g[j]=(f[num&1][j]-(LL)g[j-1]*(LL)yes[i]%mod+mod)%mod*(LL)fdie%mod;}else{rep(j,0,num-1)g[j]=f[num&1][j+1];}rep(j,0,num-1)res=(res+(LL)yes[i]*(LL)g[j]%mod*(LL)inv[j+1]%mod)%mod;write(res);if(i!=num)putchar(' '); }rep(i,0,num)f[num&1][i]=0;putchar('\n');
}
int main()
{n=read();rep(i,1,n)m[i]=read(),p[i][m[i]]=1,inv[i]=qp(i,mod-2);q=read();while(q--){int op=read();if(op){num=read();rep(i,1,num)id[i]=read();rep(i,1,num)no[i]=p[id[i]][0],yes[i]=(1-p[id[i]][0]+mod)%mod;work();}else{int x=read(),u=read(),v=read(),die=(LL)u*(LL)qp(v,mod-2)%mod,live=(LL)(v-u)%mod*(LL)qp(v,mod-2)%mod;rep(i,1,m[x])p[x][i-1]=(p[x][i-1]+(LL)p[x][i]*(LL)die%mod)%mod,p[x][i]=(LL)p[x][i]*(LL)live%mod;}}rep(i,1,n){int res=0;rep(j,1,m[i])res=(res+(LL)j*(LL)p[i][j]%mod)%mod;write(res);if(i!=n)putchar(' ');}return 0;
}
一些意见

第一次见需要对dp结果去掉一个决策的影响的题
以及今天学会设置友链了!

转载于:https://www.cnblogs.com/xzyf/p/10037375.html

并不对劲的bzoj5340:loj2552:uoj399:p4564: [Ctsc2018]假面相关推荐

  1. P4564 [CTSC2018]假面(期望)

    P4564 [CTSC2018]假面 首先容易看出结界技能对第二问敌方剩余生命值期望没有影响. 如何求出第iii个人的剩余生命值期望? 只需要根据Ei=∑j=0aij×fi,jE_i=\sum_{j= ...

  2. BZOJ5340 [Ctsc2018]假面 【概率dp】

    题目链接 BZOJ5340 题解 我们能很容易维护每个人当前各种血量的概率 设\(p[u][i]\)表示\(u\)号人血量为\(i\)的概率 每次攻击的时候,讨论一下击中不击中即可转移 是\(O(Qm ...

  3. bzoj 5340: [Ctsc2018]假面

    Description 题面 Solution 生命值范围比较小,首先维护每一个人在每个血量的概率,从而算出生存的概率,设为 \(a[i]\) 询问时,只需要考虑生存的人数,可以 \(DP\) 设 \ ...

  4. 2287. 【POJ Challenge】消失之物(数组递推\分治优化背包)

    2287. [POJ Challenge]消失之物 这题的思想和P4564 [CTSC2018]假面优化的思想一样,应该反过来说,假面那个题应该是借鉴这题的思路. 显然不能枚举每个物品消失O(n)O( ...

  5. PKUSC2018训练日程(4.18~5.30)

    (总计:共66题) 4.18~4.25:19题 4.26~5.2:17题 5.3~5.9: 6题 5.10~5.16: 6题 5.17~5.23: 9题 5.24~5.30: 9题 4.18 [BZO ...

  6. 并不对劲的概率与期望

    并不觉得今天学到了什么东西-感觉像上了数学课一样- 很对劲的太刀流-> 一.枚举法 初二数学就有提到的.不过,有时算出的概率和直觉并不相符,所以并不能直接凭感性认识,并不对劲的人有时还得理性分析 ...

  7. P4602 [CTSC2018]混合果汁(主席树)

    P4602 [CTSC2018]混合果汁 共有nnn种果汁,第iii种果汁的美味度为did_idi​,每升价格为pip_ipi​,在一瓶混合果汁中,最多只能添加lil_ili​升. 有mmm个询问,每 ...

  8. 并不对劲的BJOI2019

    一些感想 现实并非游戏,并不支持反复刷关 猎人和防御工事一起被老山龙摧毁了: 猎人惨死雨中,结云村永无放晴之日: 猎人被狂龙病毒侵蚀,天空山上黑蚀龙泛滥. 好像这才是怪物猎人系列的真实结局呢 day ...

  9. [Bzoj]5343: [Ctsc2018]混合果汁

    5343: [Ctsc2018]混合果汁 题目描述 小 R 热衷于做黑暗料理,尤其是混合果汁. 商店里有 \(n\) 种果汁,编号为 \(0,1,\cdots,n-1\) .\(i\) 号果汁的美味度 ...

最新文章

  1. 基于GIS的视频管理指挥平台
  2. linux单次任务调度,go任务调度2(linux的cron调用)
  3. java 图片请求_java请求C++客户端上传图片
  4. 微软AirSim,一个无人机和机器人的模拟器
  5. Day05:装饰器,三元表达式,函数的递归,匿名/内置函数,迭代器,模块,开发目录...
  6. 计算机知识体系图谱总结
  7. union[c++] in gamedev
  8. 本地计算机上的mysql57_win10出现本地计算机上的MySQL57服务启动后停止
  9. Atitit.判断汉字的编码 regedit 注册表里面的reg_sz
  10. linux免费邮件服务器,Linux 电子邮件服务器的搭建
  11. OpenDrive地图格式解析——案例分析
  12. Bailian2713 肿瘤面积
  13. 劲霸男装四十年:“真男人”成“老男人”还能如何劲霸?
  14. linux 启动openfire
  15. 带 SPI 接口的独立 CAN 控制器,SIT2515
  16. 文件上传漏洞初步解析(个人浅薄理解)
  17. Java多线程 线程池Executor框架
  18. 互联网服务架构设计漫谈(一)—设计考量点总览
  19. Predicting Domain Generation Algorithms with Long Short-Term Memory Networks
  20. JUL文件中日志的打印

热门文章

  1. erp故障处理流程图_博科Yigo-ERP讲堂 | 您的企业需要实施工厂维护模块吗?
  2. php 数据 缓存,php终极数据缓存,比redis、GlobalData等快200倍以上,极致性能
  3. java 创建bean_java – 使用spring按需创建bean
  4. faststart可以卸载吗_你的手机你做主!免 ROOT 卸载安卓手机预装APP
  5. Vue报错Cannot find module ‘webpack-cli/bin/config-yargs‘
  6. mysql 存储过程(提供查询语句并返回查询执行影响的行数)
  7. Linux使用awk命令获取某一行或某一列
  8. 使用python搭配pandoc实现html批量转word
  9. Android开发笔记(一百五十九)Android7.0的分屏模式
  10. Storm概念学习系列之Task任务