bzoj 5340: [Ctsc2018]假面
Description
Solution
生命值范围比较小,首先维护每一个人在每个血量的概率,从而算出生存的概率,设为 \(a[i]\)
询问时,只需要考虑生存的人数,可以 \(DP\)
设 \(g[i][j]\) 表示前 \(i\) 个人活了 \(j\) 个的概率
\(g[i][j]=g[i-1][j-1]*a[i]+g[i-1][j]*(1-a[i])\)
那么考虑每一个人时,我们对其他人做这个 \(DP\) 就行了,可以做 \(O(C*n^3)\)
实际上这是个生成函数 \((a[i]*x+1-a[i])\) ,最终求出的是每一个人的乘积,除掉 \(i\) 这个人的就是我们暴力求出来的 \(DP\) 数组
这样的话是可逆的,我们减去 \((1-a[i])\) 的项,剩下的就都是 \(a[i]\) 的项了,逆推一下即可
#include<bits/stdc++.h>
using namespace std;
template<class T>void gi(T &x){
int f;char c;
for(f=1,c=getchar();c<'0'||c>'9';c=getchar())if(c=='-')f=-1;
for(x=0;c<='9'&&c>='0';c=getchar())x=x*10+(c&15);x*=f;
}
const int N=205,M=1005,mod=998244353;
inline int qm(int x,int k){
int sum=1;
while(k){
if(k&1)sum=1ll*sum*x%mod;
x=1ll*x*x%mod;k>>=1;
}
return sum;
}
int f[N][M],n,m[N],Q,op,x,p,q,h[N],a[N],tot,c[N],g[N][N],inv[N],res[N];
inline void Modify(){
gi(x);gi(p);gi(q);
p=1ll*p*qm(q,mod-2)%mod;q=(1-p+mod)%mod;
h[0]=(f[x][0]+1ll*f[x][1]*p)%mod;
for(int i=m[x];i>=1;i--)h[i]=(1ll*f[x][i+1]*p+1ll*f[x][i]*q)%mod;
for(int i=m[x];i>=0;i--)f[x][i]=h[i],h[i]=0;
}
inline void solve(){
gi(tot);
for(int i=1;i<=tot;i++){
gi(x);
a[i]=(1-f[x][0]+mod)%mod;
}
memset(g,0,sizeof(g));
g[0][0]=1;
for(int i=1;i<=tot;i++){
g[i][0]=g[i-1][0]*(1-a[i]+mod)%mod;
for(int j=0;j<=i;j++)
g[i][j]=(1ll*g[i-1][j-1]*a[i]+1ll*g[i-1][j]*(1-a[i]+mod))%mod;
}
for(int i=1;i<=tot;i++){
int I=qm(a[i],mod-2),ans=0;
for(int j=1;j<=tot;j++)h[j]=g[tot][j];
for(int j=tot;j>=1;j--){
ans=(ans+1ll*I*h[j]%mod*inv[j])%mod;
h[j-1]=(h[j-1]-1ll*h[j]*(1-a[i]+mod)%mod*I)%mod;
h[j]=0;
}
if(ans<0)ans+=mod;
ans=1ll*ans*a[i]%mod;
printf("%d ",ans);
}
puts("");
}
int main(){
freopen("pp.in","r",stdin);
freopen("pp.out","w",stdout);
for(int i=1;i<N;i++)inv[i]=qm(i,mod-2);
cin>>n;
for(int i=1;i<=n;i++)gi(m[i]),f[i][m[i]]=1;
cin>>Q;
while(Q--){
gi(op);
if(op==0)Modify();
else solve();
}
for(int i=1;i<=n;i++){
int ans=0;
for(int j=1;j<=m[i];j++)ans=(ans+1ll*f[i][j]*j)%mod;
printf("%d ",ans);
}
return 0;
}
bzoj 5340: [Ctsc2018]假面的更多相关文章
- BZOJ5340: [Ctsc2018]假面
BZOJ5340: [Ctsc2018]假面 https://lydsy.com/JudgeOnline/problem.php?id=5340 分析: 背包,只需要求\(g_{i,j}\)表示强制活 ...
- [BZOJ]1064: [Noi2008]假面舞会
题目大意:n个人,k种假面,每人戴一种,戴第i种的可以看见第i+1种,戴第k种的可以看见第1种,给出m条关系表示一个人可以看到另一个人,问k可能的最大值和最小值.(n<=100,000,m< ...
- BZOJ5340 & 洛谷4564 & LOJ2552:[CTSC2018]假面——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=5340 https://www.luogu.org/problemnew/show/P4564 ht ...
- [Bzoj]5343: [Ctsc2018]混合果汁
5343: [Ctsc2018]混合果汁 题目描述 小 R 热衷于做黑暗料理,尤其是混合果汁. 商店里有 \(n\) 种果汁,编号为 \(0,1,\cdots,n-1\) .\(i\) 号果汁的美味度 ...
- [bzoj 1064][NOI2008]假面舞会(dfs判断环)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1064 分析: 如果a看到b,则a->b 那么: 1.如果图中有环,则说明这个环的 ...
- [CTSC2018] 假面 | 期望 DP
题目链接 LOJ 2552 Luogu P4564 考场上这道题我先是写了个70分暴力,然后发现似乎可以NTT,然鹅问题是--我没学过NTT,遂脑补之,脑补出来了,下午出成绩一看,卡成暴力分(70)- ...
- bzoj 1064 noi2008 假面舞会题解
莫名其妙的变成了我们的noip互测题... 其实这题思想还是比较简单的,只是分类不好分而已 其实就是一个dfs的事 首先,非常明显,原题目中的所有关系可以抽象成一个图(这是...显而易见的吧...) ...
- BZOJ 1064: [Noi2008]假面舞会(dfs + 图论好题!)
http://www.lydsy.com/JudgeOnline/problem.php?id=1064 题意: 思路: 考虑以下几种情况: ①无环并且是树: 无环的话就是树结构了,树结构的话想一下就 ...
- BZOJ5340: [Ctsc2018]假面【概率+期望】【思维】
LINK 思路 首先考虑减血,直接一个dp做过去,这个部分分不难拿 然后是\(op=1\)的部分 首先因为要知道每个人被打的概率,所以需要算出这个人活着的时候有多少个人活着时概率是什么 那么用\(g_ ...
随机推荐
- SQL Server 根据关键字和结束符提取字符串子串
/* @info-待截取的字符串 @indexStr-截取子串的起始字符串 @split-截取子串的结束符号 列入依次传入 胸片:正常.心电图:异常,需要注意.血常规检查:正常. 心电图 '.' 返回 ...
- SQL语句也可以重构优化
真的,不管是程序中的代码可以重构优化,在SQL Server的语句,也是可以的.下面举个例子,在存储过程中,所传入的数据参数不能为空,另外在对数据表进行更新时,所更新的字段如果是空的话,就更新,如果传 ...
- Mysql初识数据库《三》数据库概述
1 什么是数据(Data) 描述事物的符号记录称为数据,描述事物的符号既可以是数字,也可以是文字.图片,图像.声音.语言等,数据由多种表现形式,它们都可以经过数字化后存入计算机 在计算机中描述一个事物 ...
- Jmeter_实现Excel文件导出到本地
一般而言,对于页面的“导出”操作,主要经历如下两个操作:①根据数据库的内容,将文件导出到应用服务器上:②将服务器上的文件下载到本地电脑: Jmeter同LoadRunner类似,只能记录服务端与客户端 ...
- 题解 P1720 【月落乌啼算钱】
题目链接 定义一个函数比较好求. #include<bits/stdc++.h>//万能头文件 using namespace std; double F(int x)//定义函数,为了保 ...
- 洛谷P3122 [USACO15FEB]圈住牛Fencing the Herd(计算几何+CDQ分治)
题面 传送门 题解 题目转化一下就是所有点都在直线\(Ax+By-C=0\)的同一侧,也就可以看做所有点代入\(Ax+By-C\)之后的值符号相同,我们只要维护每一个点代入直线之后的最大值和最小值,看 ...
- Unity---动画系统学习(6)---Avatar Mask动画融合、Layers动画分层、IK反向动力学
1. 介绍 Avatar Mask(动画融合) 前面我们一直介绍的都是动画混合,一般用于解决边跑边转弯的问题.而动画融合一般用于解决例如边跑边挥手的问题. 简单说就是让跑步去控制腿的骨骼,挥手控制手的 ...
- 转载---<html>与<body>
关于根元素html以及body的对比,主要是遇到设置背景色的问题,这里转载张鑫旭的关于html和body对比的文.(直接贴过来,是为了以后自己方便看) 原文地址:http://www.zhangxin ...
- Java 实现手机发送短信验证码
Java 实现手机发送短信验证码 采用引入第三方工具的方式,网上查了半天,发现简单的实现方式便是注册一个中国网建的账号,新建账号的时候会附带赠几条免费短信,彩信 ,之后想要在使用就得花钱了.简单的操作 ...
- SQL语句之行操作
SQL语句系列 1.SQL语句之行操作 2.SQL语句之表操作 3.SQL语句之数据库操作 4.SQL语句之用户管理 关系型数据库的存储形式 在关系型数据库中,数据都是以类似于Excel表格的形式存储 ...