洛谷 P4564 [CTSC2018]假面(期望+dp)
题意:
有 \(n\) 个怪物,第 \(i\) 个怪物初始血量为 \(m_i\)。有 \(Q\) 次操作:
0 x u v
,有 \(p=\frac{u}{v}\) 的概率令 \(m_x\) 减 \(1\),另外 \(1-p\) 的概率啥也不干。如果 \(m_x=0\),那么这个操作无效。1 k x[1] x[2] ... x[k]
,在 \(x_1,x_2,\dots,x_k\) 这 \(k\) 个怪物中的血量不为 \(0\) 的怪物中,随机选择一个怪物。问对于 \(i=1,2,\dots,k\),怪物 \(x_i\) 被选中的概率是多少。
另外,所有操作结束后,输出 \(n\) 个数表示怪物 \(i\) 的血量的期望值。
\(n \leq 200\),\(q \leq 2 \times 10^5\),\(1\) 操作的次数 \(\leq 10^3\),\(m_i \leq 100\)。
虽说是为了刷期望的题而来的,但其实这题的关键点不在于期望。
我们令 \(dp_{i,j}\) 表示在当前时刻,怪物 \(i\) 的血量为 \(j\) 的概率。
对于 \(0\) 操作而言,你就暴力修改 \(dp_{x,j}\) 的值,直接一遍背包就行了,时间复杂度 \(\mathcal O(m)\)。
本题难就难在 \(1\) 操作怎样处理。
最 naive 的想法是,枚举每个 \(x_i\),显然 \(x_i\) 的血量是不能为 \(0\) 的。
然后在剩下 \(k-1\) 个怪物中跑一遍背包,\(f_{i,j}\) 表示在前 \(i\) 个怪物中有 \(j\) 个血量不为 \(0\) 的怪物的概率,背包进行转移。
答案为 \((1-dp_{x_t,0})\times (\sum_{i=0}^{k-1}f_{k,i}\times\frac{1}{i+1})\)。
式子很好理解,第一个括号表示 \(x_t\) 的血量不为 \(0\) 的概率,第二个括号枚举了血量不为 \(0\) 的怪物个数并用乘法原理计算出概率累加答案。
但这样是 \(n^3\) 的。
我的另一个 naive 的想法是 \(f_{i,j}\) 表示在前 \(i\) 个怪物中有 \(j\) 个血量不为 \(0\) 的怪物的概率,\(g_{i,j}\) 表示在后 \(i\) 个怪物中有 \(j\) 个血量不为 \(0\) 的怪物的概率。
这样计算 \(f,g\) 的时间复杂度降到了 \(n^2\),但统计答案还是 \(n^3\) 的。
这就要用到从背包中删除元素这一技巧。
\(f_{i,j}\) 的状态转移式子为 \(f_{i,j}=p\times f_{i-1,j-1}+(1-p)\times f_{i-1,j}\)
当删除一个元素的时候,我们其实是已知 \(f_{i,j}\) 和 \(p\) 还原出 \(f_{i-1,j}\)。
注意到 \(f_{i-1,i}=0\),也就是说 \(f_{i,i}=p\times f_{i-1,i-1}\)。
于是我们倒着循环,用 \(f_{i-1,j}=\dfrac{f_{i,j+1}-p\times f_{i-1,j+1}}{1-p}\) 求出 \(f_{i-1,j}\)
然后按照之前的公式累加答案即可。
\(\mathcal O(qm+cn^2)\)
注意预处理逆元,否则时间复杂度会多一个 \(\log\)(CSP-S 2020 的悲惨回忆)
#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define fz(i,a,b) for(int i=a;i<=b;i++)
#define fd(i,a,b) for(int i=a;i>=b;i--)
#define ffe(it,v) for(__typeof(v.begin()) it=v.begin();it!=v.end();it++)
#define fill0(a) memset(a,0,sizeof(a))
#define fill1(a) memset(a,-1,sizeof(a))
#define fillbig(a) memset(a,63,sizeof(a))
#define pb push_back
#define mp make_pair
typedef pair<int,int> pii;
typedef long long ll;
bool chkmin(int &x,int y){return ((x>y)?(x=y,1):0);}
bool chkmax(int &x,int y){return ((x<y)?(x=y,1):0);}
const int MOD=998244353;
const int MAXN=200+5;
const int MAXM=100+5;
int n,m,x[MAXN];
ll dp[MAXN][MAXM],iv[MAXN],tmp[MAXN],f[MAXN][MAXN],inv[MAXN];
ll qpow(ll x,int e){
ll ret=1;
while(e){
if(e&1) ret=ret*x%MOD;
x=x*x%MOD;e>>=1;
} return ret;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
int x;scanf("%d",&x);dp[i][x]=1;chkmax(m,x);iv[i]=1;
}
for(int i=1;i<=n;i++) inv[i]=qpow(i,MOD-2);
int Q;scanf("%d",&Q);while(Q--){
int opt;scanf("%d",&opt);
if(opt==0){
int x,u,v;scanf("%d%d%d",&x,&u,&v);
ll p=1ll*u*qpow(v,MOD-2)%MOD;
memset(tmp,0,sizeof(tmp));
for(int i=0;i<=m;i++){
if(i==0) tmp[i]=(tmp[i]+dp[x][i])%MOD;
else{
tmp[i]=(tmp[i]+dp[x][i]*(1-p+MOD)%MOD)%MOD;
tmp[i-1]=(tmp[i-1]+dp[x][i]*p%MOD)%MOD;
}
}
for(int i=0;i<=m;i++) dp[x][i]=tmp[i];
iv[x]=qpow(1-dp[x][0]+MOD,MOD-2);
} else {
int k;scanf("%d",&k);
for(int i=1;i<=k;i++) scanf("%d",&x[i]);
memset(f,0,sizeof(f));f[0][0]=1;
for(int i=1;i<=k;i++){
for(int j=0;j<=i;j++){
f[i][j]=f[i-1][j]*dp[x[i]][0]%MOD;
if(j) f[i][j]=(f[i][j]+f[i-1][j-1]*(1-dp[x[i]][0]+MOD)%MOD)%MOD;
}
}
// for(int i=0;i<=k;i++) printf("%lld ",f[k][i]);printf("\n");
for(int i=1;i<=k;i++){
ll ans=0;memset(tmp,0,sizeof(tmp));
for(int j=k-1;~j;j--)
tmp[j]=(f[k][j+1]-tmp[j+1]*dp[x[i]][0]%MOD+MOD)%MOD*iv[x[i]]%MOD;
// for(int j=0;j<=k;j++) printf("%lld ",tmp[j]);
// printf("\n");
for(int j=0;j<k;j++)
ans=(ans+(tmp[j]*(1-dp[x[i]][0]+MOD)%MOD)*inv[j+1]%MOD)%MOD;
printf("%lld ",ans);
} printf("\n");
}
}
for(int i=1;i<=n;i++){
ll ans=0;
for(int j=0;j<=m;j++) ans=(ans+1ll*j*dp[i][j]%MOD)%MOD;
printf("%lld ",ans);
} printf("\n");
return 0;
}
洛谷 P4564 [CTSC2018]假面(期望+dp)的更多相关文章
- [CTSC2018] 假面 | 期望 DP
题目链接 LOJ 2552 Luogu P4564 考场上这道题我先是写了个70分暴力,然后发现似乎可以NTT,然鹅问题是--我没学过NTT,遂脑补之,脑补出来了,下午出成绩一看,卡成暴力分(70)- ...
- 洛谷P3600 随机数生成器(期望dp 组合数)
题意 题目链接 Sol 一条重要的性质:如果某个区间覆盖了另一个区间,那么该区间是没有用的(不会对最大值做出贡献) 首先不难想到枚举最终的答案\(x\).这时我们需要计算的是最大值恰好为\(x\)的概 ...
- 洛谷P3600随机数生成器——期望+DP
原题链接 写到一半发现写不下去了... 所以orz xyz32768,您去看这篇题解吧,思路很清晰,我之前写的胡言乱语与之差距不啻天渊 #include <algorithm> #incl ...
- 洛谷 P5279 - [ZJOI2019]麻将(dp 套 dp)
洛谷题面传送门 一道 dp 套 dp 的 immortal tea 首先考虑如何判断一套牌是否已经胡牌了,考虑 \(dp\).我们考虑将所有牌按权值大小从大到小排成一列,那我们设 \(dp_ ...
- 洛谷2344 奶牛抗议(DP+BIT+离散化)
洛谷2344 奶牛抗议 本题地址:http://www.luogu.org/problem/show?pid=2344 题目背景 Generic Cow Protests, 2011 Feb 题目描述 ...
- Lightning Conductor 洛谷P3515 决策单调性优化DP
遇见的第一道决策单调性优化DP,虽然看了题解,但是新技能√,很开森. 先%FlashHu大佬,反正我是看了他的题解和精美的配图才明白的,%%%巨佬. 废话不多说,看题: 题目大意 已知一个长度为n的序 ...
- 洛谷P1541 乌龟棋(四维DP)
To 洛谷.1541 乌龟棋 题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点,游 ...
- 【洛谷】P1052 过河【DP+路径压缩】
P1052 过河 题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙 ...
- 【题解】洛谷P1052 [NOIP2005TG] 过河(DP+离散化)
题目来源:洛谷P1052 思路 一开始觉得是贪心 但是仔细一想不对 是DP 再仔细一看数据不对 有点大 如果直接存下的话 显然会炸 那么就需要考虑离散化 因为一步最大跳10格 那么我们考虑从1到10都 ...
随机推荐
- SpringCloud 2020.0.4 系列之Eureka
1. 概述 老话说的好:遇见困难,首先要做的是积极的想解决办法,而不是先去泄气.抱怨或生气. 言归正传,微服务是当今非常流行的一种架构方式,其中 SpringCloud 是我们常用的一种微服务框架. ...
- 前端大牛带你了解JavaScript 函数式编程
前言 函数式编程在前端已经成为了一个非常热门的话题.在最近几年里,我们看到非常多的应用程序代码库里大量使用着函数式编程思想. 本文将略去那些晦涩难懂的概念介绍,重点展示在 JavaScript 中到底 ...
- 计算机网络传输层之TCP协议(tcp协议特点、tcp报文段首部格式、tcp连接建立---三次握手、tcp连接释放---四次握手)
文章转自:https://blog.csdn.net/weixin_43914604/article/details/105516090 学习课程:<2019王道考研计算机网络> 学习目的 ...
- 洛谷 P4867 Gty的二逼妹子序列
链接: P4867 题意: 给出长度为 \(n(1\leq n\leq 10^5)\) 的序列 \(s\),保证\(1\leq s_i\leq n\).有 \(m(1\leq m\leq 10^6)\ ...
- 洛谷 P2680 [NOIP2015 提高组] 运输计划
链接:P2680 题意: 在树上把一条边边权变为0使得最长给定路径最短 分析: 最大值最小可以想到二分答案,对于每一个mid,寻找所有大于mid的路径,再寻找是否存在一条边使得删去它后大于mid的路径 ...
- 【做题记录】CF1451E2 Bitwise Queries (Hard Version)
CF1451E2 Bitwise Queries (Hard Version) 题意: 有 \(n\) 个数( \(n\le 2^{16}\) ,且为 \(2\) 的整数次幂,且每一个数都属于区间 \ ...
- hdu 3863 No Gambling (不会证明,但是是对的,,)
题意: N=4时 规则: 双方每次可以连接自己颜色的两个点(相邻,长度为1),线和线不能交叉重叠. 蓝方要连接左右,红方要连接上下. 蓝方先.问谁先连接? 思路: 经过观察....蓝方胜....... ...
- 在纯JaveScript中实现报表导出:从“PDF”到“JPG”
我们在前端报表中完成了各种工作数据的输入或内容处理之后,需要做什么? 数据的导出! 这些数据的常用导出格式有:PDF.Excel.HTML和图片几大类型. 但总有一些实际应用场景,需要的不仅仅是将现有 ...
- 开发属于自己的包,并上传到npm上
1.DIY开发包 1.1符合标准的包结构 一个规范的包,它的组成结构,必须符合以下3点要求: 包必须以单独的目录而存在 包的顶级目录下,必须包含package.json这个包管理文件 package. ...
- 2021广东省强网杯WriteUp
个人赛 网络诈骗 参考 https://github.com/Heyxk/notes/issues/1 先把EnMicroMsg.db提出来 CompatibleInfo.cfg是0kb,用第一种方法 ...