[CTSC2018]假面
先来考虑一下第一问,血量有\(P\)的概率减\(1\)
由于我们最后需要求每一个人的期望血量,于是考虑维护出每个人处于不同血量时候的概率
一个简单\(dp\)即可
\]
\(dp_{i,j}\)表示第\(i\)个人血量为\(j\)的概率
第二问,发现概率的选中的人中的存活人数有关
于是每一个人只有两种状态,生或者是死,我们考虑求出每种存活人数对应的概率是多少
显然这里我们有一个这样的\(dp\)
\]
\(f_{i,j}\)表示前\(i\)个人里存活\(j\)个人的概率
发现做一次这个\(dp\)是\(O(n^2)\)的,对每一个人做一遍复杂度就是\(O(n^3)\)了
考虑消除某一个人的影响
设\(f_{j}=f_{n,j},g_{j}=g_{n-1,j}\),我们要消除第\(n\)的人的影响
显然边界条件有
\]
于是
\]
求得了\(g_0\),我们就可以递推了
\]
于是就有
\]
但是需要特别注意\(p_n=1\)的时候我们需要特殊处理一波,也非常简单就是
\]
代码
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#define re register
#define LL long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
const int maxn=205;
const LL mod=998244353;
inline int read() {
char c=getchar();int x=0;while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();return x;
}
int n,h[maxn],m,opt,a[maxn];
LL dp[maxn][105],t[maxn],f[maxn],inv[maxn],g[maxn];
inline LL ksm(LL a,LL b) {
LL S=1;
while(b) {if(b&1) S=S*a%mod;b>>=1;a=a*a%mod;}
return S;
}
int main() {
n=read();
for(re int i=1;i<=n;i++) h[i]=read(),dp[i][h[i]]=1;
m=read();
inv[1]=1;
for(re int i=2;i<=n;i++) inv[i]=(mod-mod/i)*inv[mod%i]%mod;
while(m--) {
opt=read();
if(opt==0) {
int pos=read();
LL u=read(),v=read();
LL P=ksm(v,mod-2)*u%mod;
for(re int i=0;i<=h[pos];i++)
dp[pos][i]=(dp[pos][i]*(1-P+mod)%mod+dp[pos][i+1]*P%mod)%mod;
}
if(opt==1) {
int k=read();
for(re int i=1;i<=k;i++) a[i]=read();
for(re int i=1;i<=k;i++) {
t[a[i]]=0;
for(re int j=1;j<=h[a[i]];j++)
t[a[i]]=(t[a[i]]+dp[a[i]][j])%mod;
}
memset(f,0,sizeof(f));
f[0]=1;
for(re int i=1;i<=k;i++)
for(re int j=i;j>=0;--j) {
f[j]=(f[j]*(1-t[a[i]]+mod)%mod)%mod;
if(j-1>=0) f[j]=(f[j]+f[j-1]*t[a[i]]%mod)%mod;
}
for(re int i=1;i<=k;i++) {
memset(g,0,sizeof(g));
if(t[a[i]]!=1) {
LL d=ksm((1-t[a[i]]+mod)%mod,mod-2);
g[0]=f[0]*d%mod;
for(re int j=1;j<k;j++)
g[j]=(f[j]-g[j-1]*t[a[i]]%mod+mod)*d%mod;
}
else for(re int j=1;j<=k;j++) g[j-1]=f[j];
LL ans=0;
for(re int j=0;j<k;j++)
ans=(ans+g[j]*inv[j+1]%mod)%mod;
printf("%lld ",ans*t[a[i]]%mod);
}
putchar(10);
}
}
for(re int i=1;i<=n;i++) {
LL now=0;
for(re int j=1;j<=h[i];j++)
now=(now+dp[i][j]*(LL)j%mod)%mod;
printf("%lld ",now);
}
return 0;
}
[CTSC2018]假面的更多相关文章
- BZOJ5340: [Ctsc2018]假面
BZOJ5340: [Ctsc2018]假面 https://lydsy.com/JudgeOnline/problem.php?id=5340 分析: 背包,只需要求\(g_{i,j}\)表示强制活 ...
- [CTSC2018] 假面 | 期望 DP
题目链接 LOJ 2552 Luogu P4564 考场上这道题我先是写了个70分暴力,然后发现似乎可以NTT,然鹅问题是--我没学过NTT,遂脑补之,脑补出来了,下午出成绩一看,卡成暴力分(70)- ...
- BZOJ5340: [Ctsc2018]假面【概率+期望】【思维】
LINK 思路 首先考虑减血,直接一个dp做过去,这个部分分不难拿 然后是\(op=1\)的部分 首先因为要知道每个人被打的概率,所以需要算出这个人活着的时候有多少个人活着时概率是什么 那么用\(g_ ...
- BZOJ5340 & 洛谷4564 & LOJ2552:[CTSC2018]假面——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=5340 https://www.luogu.org/problemnew/show/P4564 ht ...
- bzoj 5340: [Ctsc2018]假面
Description 题面 Solution 生命值范围比较小,首先维护每一个人在每个血量的概率,从而算出生存的概率,设为 \(a[i]\) 询问时,只需要考虑生存的人数,可以 \(DP\) 设 \ ...
- BZOJ5340 [Ctsc2018]假面 【概率dp】
题目链接 BZOJ5340 题解 我们能很容易维护每个人当前各种血量的概率 设\(p[u][i]\)表示\(u\)号人血量为\(i\)的概率 每次攻击的时候,讨论一下击中不击中即可转移 是\(O(Qm ...
- [CTSC2018]假面(概率DP)
考场上以为CTSC的概率期望题都不可做,连暴力都没写直接爆零. 结果出来发现全场70以上,大部分AC,少于70的好像极少,感觉血亏. 设a[i][j]表示到当前为止第i个人的血量为j的概率(注意特判血 ...
- 并不对劲的bzoj5340:loj2552:uoj399:p4564: [Ctsc2018]假面
题目大意 有\(n\)(\(n\leq200\))个非负整数\(m_1,m_2,...,m_n\)(\(\forall i\in[1,n],m_i\leq100\)),有\(q\)(\(q\leq2* ...
- UOJ399 CTSC2018 假面 期望、DP
传送门 \(Q \leq 200000 , C \leq 1000 , m_i \leq 100\)-- 先考虑如何维护最后一次操作时所有人的血量期望.不难发现我们需要的复杂度是\(O(Qm_i)\) ...
随机推荐
- PL/SQL之游标的使用
Oracle中的游标有两种: 显式游标 用CURSOR...IS 命令定义的游标,它可以对查询语句(SELECT)返回的多条记录进行处理. 隐式游标 是在执行插入(INSERT).删除(DELETE) ...
- 远程连接MongoDB数据库
不使用用户名和密码 安装MongoDB后,默认不使用用户名和密码即可在本地登录,如需远程登录,只要修改/bin/mongo.conf文件即可
- 如鹏网学习笔记(十三)EasyUI
一.EasyUI简介 是一组基于JQuery的UI插件集合 主要作用:为JQuery对象提供新的方法,实现新的功能 可以快速创建出简洁.友好.美观的页面,非常适合做网站后台管理页面(不够漂亮,不适合做 ...
- 一款软件同时管理MySQL,MongoDB数据库
互联网应用开发日新月异,去年分布式应用都还大量使用springmvc+ zookeeper +dubbo,今年就被spring boot ,spring cloud微服务架构替换了,技术的更新换代太快 ...
- 在IIS中部署好WCF服务站点后,本机访问服务无问题,局域网中其他电脑访问不到
1.问题描述 在IIS中部署好WCF服务站点后,本机访问服务无问题,局域网中其他电脑访问不到. 2.解决方法 (1)控制面板 -> Windows防火墙 -> 高级设置 (2)属性 (3) ...
- 粗粒度权限控制(拦截是否登录、拦截用户名admin权限)
RBAC --> 基于角色的权限控制 tb_user tb_role tb_userrole tb_menu(增.删.改.查) tb_rolemenu 1 说明 给出三个页面:index ...
- 一步一步实现web程序信息管理系统之三----登陆业务逻辑实现(验证码功能+参数获取)
本篇紧接着上一篇文章[一步一步实现web程序信息管理系统之二----后台框架实现跳转登陆页面] 验证码功能 一般验证码功能实现方式为,前端界面访问一个url请求,后端服务代码生成一个图片流返回至浏览器 ...
- 关于html 中form表单的内标签和使用
表单标记 1.普通文本框: <input type=”text” name=”名称” value=”值”;不写value默认为空/> 2.密码框:<input type=”passw ...
- Http Status Code 套餐合集(转载)
1xx(临时响应) 表示临时响应并需要请求者继续执行操作的状态代码. 100(继续)请求者应当继续提出请求. 服务器返回此代码表示已收到请求的第一部分,正在等待其余部分. 101(切换协议)请求者已要 ...
- websocket协议及案例
WebSocket是一种用于在服务器与客户端之间实现高效的双向通信的机制.可以解决数据实时性要求比较高的应用,比如:在线聊天,在线教育,炒股或定位等. 一:websocket产生背景: 为了解决这种实 ...