BZOJ5340: [Ctsc2018]假面【概率+期望】【思维】
思路
首先考虑减血,直接一个dp做过去,这个部分分不难拿
然后是\(op=1\)的部分
首先因为要知道每个人被打的概率,所以需要算出这个人活着的时候有多少个人活着时概率是什么
那么用\(g_{i,j}\)表示第i个人还活着的时候还有其他的j个人活着的概率
这个东西暴力DP是\(n^3\)的
那么可以考虑优化,用\(f_{i,j}\)表示前i个人有j个人活着的概率
有转移:\(f_{i,j}=f_{i-1,j-1}*(1-p_i)+f_{i-1,j}*p_i\),其中\(p_i\)表示第i个人已经死了的概率
j等于0特判一下就好了
因为我们用任意i的顺序做f的DP最后的\(f_{n}\)那一行都不会变
所以可以考虑用\(f_n\)逆推回g,因为\(g_{i,j}=f_{n-1,j}\),我们默认这个时候正在算的i是最后一个
那么根据上面的转移式可以得到\(f_{i-1,j}=\frac{f_{i,j}-(1-p_{now})*f_{i-1,j-1}}{p_{now}}\)
当\(p_{now}=0\)的时候我们发现\(f_{i,j}=f_{i-1,j-1}\),也就是说最后一个人无论如何是不会死的,那么\(f_{i-1,j}=f_{i,j+1}\)
而当j=0的时候我们又需要特判了,首先入如果\(p_{now}=0\),\(g_{now,0} = f_{n,1}\),否则\(g_{now,0}=\frac{f_{n,0}}{p_{now}}\)
剩下的很简单
然后就愉快结束了
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
namespace io {
const int BUFSIZE = 1 << 20;
char ibuf[BUFSIZE], *is = ibuf, *it = ibuf;
char obuf[BUFSIZE], *os = obuf, *ot = obuf + BUFSIZE - 1;
char read_char() {
if (is == it)
it = (is = ibuf) + fread(ibuf, 1, BUFSIZE, stdin);
return *is++;
}
int read_int() {
int x = 0, f = 1;
char c = read_char();
while (!isdigit(c)) {
if (c == '-') f = -1;
c = read_char();
}
while (isdigit(c)) x = x * 10 + c - '0', c = read_char();
return x * f;
}
ll read_ll() {
ll x = 0, f = 1;
char c = read_char();
while (!isdigit(c)) {
if (c == '-') f = -1;
c = read_char();
}
while (isdigit(c)) x = x * 10 + c - '0', c = read_char();
return x * f;
}
void read_string(char* s) {
char c = read_char();
while (isspace(c)) c = read_char();
while (!isspace(c)) *s++ = c, c = read_char();
*s = 0;
}
void flush() {
fwrite(obuf, 1, os - obuf, stdout);
os = obuf;
}
void print_char(char c) {
*os++ = c;
if (os == ot) flush();
}
void print_int(int x) {
static char q[20];
if (!x) print_char('0');
else {
if (x < 0) print_char('-'), x = -x;
int top = 0;
while (x) q[top++] = x % 10 + '0', x /= 10;
while (top--) print_char(q[top]);
}
}
void print_ll(ll x) {
static char q[20];
if (!x) print_char('0');
else {
if (x < 0) print_char('-'), x = -x;
int top = 0;
while (x) q[top++] = x % 10 + '0', x /= 10;
while (top--) print_char(q[top]);
}
}
struct flusher_t {
~flusher_t() {
flush();
}
} flusher;
};
using namespace io;
const int Mod = 998244353;
const int N = 210;
int add(int a, int b) {
return (a += b) >= Mod ? a - Mod : a;
}
int sub(int a, int b) {
return (a -= b) < 0 ? a + Mod : a;
}
int mul(int a, int b) {
return 1ll * a * b % Mod;
}
int fast_pow(int a, int b) {
int res = 1;
while (b) {
if (b & 1) res = mul(res, a);
b >>= 1;
a = mul(a, a);
}
return res;
}
int n, q, m[N], inv[N];
int c[N], res[N];
int p[N][N], f[N][N], g[N][N];
//p[i][j] 第i个人 还有j点血的概率
//f[i][j] 前i个人还有j个人活下来的概率
//g[i][j] 除了第i个人 还有j个人活下来的概率
int main() {
n = read_int();
inv[0] = 1;
for (int i = 1; i <= n; ++i) {
m[i] = read_int();
p[i][m[i]] = 1;
inv[i] = fast_pow(i, Mod - 2);
}
q = read_int();
while (q--) {
int op = read_int();
if (!op) {
int x = read_int(), p1 = read_int(), p2 = read_int();
int k = mul(fast_pow(p2, Mod - 2), p1);
p[x][0] = add(p[x][0], mul(p[x][1], k));
for (int i = 1; i <= m[x]; ++i) {
p[x][i] = add(mul(p[x][i + 1], k), mul(p[x][i], sub(1, k)));
}
} else {
int num = read_int();
for (int i = 1; i <= num; ++i) {
c[i] = read_int();
}
f[0][0] = 1;
for (int i = 1; i <= num; ++i) {
f[i][0] = mul(f[i - 1][0], p[c[i]][0]);
for (int j = 1; j <= i; ++j) {
f[i][j] = add(mul(f[i - 1][j - 1], sub(1, p[c[i]][0])), mul(f[i - 1][j], p[c[i]][0]));
}
}
for (int i = 1; i <= num; ++i) {
int invp = fast_pow(p[c[i]][0], Mod - 2);
if (!p[c[i]][0]) g[i][0] = f[num][1];
else g[i][0] = mul(f[num][0], invp); //**
for (int j = 1; j < num; ++j) {
if (!p[c[i]][0]) g[i][j] = f[num][j + 1];
else g[i][j] = mul(invp, sub(f[num][j], mul(g[i][j - 1], sub(1, p[c[i]][0]))));
}
}
for (int i = 1; i <= num; ++i) {
res[i] = 0;
for (int j = 0; j < num; ++j) {
res[i] = add(res[i], mul(inv[j + 1], g[i][j]));
}
res[i] = mul(res[i], sub(1, p[c[i]][0]));
print_int(res[i]), print_char(' ');
}
print_char('\n');
}
}
for (int i = 1; i <= n; ++i) {
int cur = 0;
for (int j = 1; j <= m[i]; ++j) {
cur = add(cur, mul(p[i][j], j));
}
print_int(cur), print_char(' ');
}
return 0;
}
BZOJ5340: [Ctsc2018]假面【概率+期望】【思维】的更多相关文章
- BZOJ5340: [Ctsc2018]假面
BZOJ5340: [Ctsc2018]假面 https://lydsy.com/JudgeOnline/problem.php?id=5340 分析: 背包,只需要求\(g_{i,j}\)表示强制活 ...
- [CTSC2018]假面(概率DP)
考场上以为CTSC的概率期望题都不可做,连暴力都没写直接爆零. 结果出来发现全场70以上,大部分AC,少于70的好像极少,感觉血亏. 设a[i][j]表示到当前为止第i个人的血量为j的概率(注意特判血 ...
- BZOJ5340 [Ctsc2018]假面 【概率dp】
题目链接 BZOJ5340 题解 我们能很容易维护每个人当前各种血量的概率 设\(p[u][i]\)表示\(u\)号人血量为\(i\)的概率 每次攻击的时候,讨论一下击中不击中即可转移 是\(O(Qm ...
- 洛谷 P4564 [CTSC2018]假面(期望+dp)
题目传送门 题意: 有 \(n\) 个怪物,第 \(i\) 个怪物初始血量为 \(m_i\).有 \(Q\) 次操作: 0 x u v,有 \(p=\frac{u}{v}\) 的概率令 \(m_x\) ...
- 【BZOJ-1419】Red is good 概率期望DP
1419: Red is good Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 660 Solved: 257[Submit][Status][Di ...
- uvalive 7331 Hovering Hornet 半平面交+概率期望
题意:一个骰子在一个人正方形内,蜜蜂在任意一个位置可以出现,问看到点数的期望. 思路:半平面交+概率期望 #include<cstdio> #include<cstring> ...
- OI队内测试一【数论概率期望】
版权声明:未经本人允许,擅自转载,一旦发现将严肃处理,情节严重者,将追究法律责任! 序:代码部分待更[因为在家写博客,代码保存在机房] 测试分数:110 本应分数:160 改完分数:200 T1: 题 ...
- 2016 多校联赛7 Balls and Boxes(概率期望)
Mr. Chopsticks is interested in random phenomena, and he conducts an experiment to study randomness. ...
- 牛客网多校赛第9场 E-Music Game【概率期望】【逆元】
链接:https://www.nowcoder.com/acm/contest/147/E 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524 ...
随机推荐
- 《剑指offer》第十六题(数值的整数次方)
// 面试题:数值的整数次方 // 题目:实现函数double Power(double base, int exponent),求base的exponent // 次方.不得使用库函数,同时不需要考 ...
- 【Golang】 可以自动生成测试用例的库--gotests
简介 gotests是一个Golang命令行工具,它可以使编写Go的测试代码变得容易.它能基于目标源文件的函数和方法生成数据驱动测试用例,并且在此过程会自动导入任何依赖. 下面是gotests在使用S ...
- flash破解工具/flash decompiler
如果想比较方便地参观浏览一下flash(swf)文件里面的内容,推荐使用国外免费开源的工具JPEXS Free Flash Decompiler. 传送门:https://www.free-decom ...
- angular5 路由传参的几种方式
此处介绍三种方式 方式一: 问号后面带的参数, 例如:/product?id=1&name=iphone还可以是: [routerLink]="['/books']" [q ...
- putty xming gnome-session
在windows里远程连接linux的最好方法. 比VNC方式好多了 1) xming启动一个窗口 2) putty 设置完X11 forwarding之后,远程登录 3) 在putty 里启动 gn ...
- Assert.IsNotNull 方法(判断对象不为NULL)
Assert.IsNotNull 方法 Visual Studio 2012 其他版本 Visual Studio 2010 Visual Studio 2008 Visual Studio 20 ...
- [洛谷P1507]NASA的食物计划 以及 对背包问题的整理
P1507 NASA的食物计划 题面 每个物品有三个属性,"所含卡路里":价值\(v\),"体积":限制1\(m_1\),以及"质量":限制 ...
- amoba读写分离
原文链接:http://www.abcdocker.com/abcdocker/81 Amoeba(变形虫)项目,该开源框架于2008年 开始发布一款 Amoeba for Mysql软件.这个软件致 ...
- antd-pro1.0使用jest对react组件进行单元测试
前言 基于React+Ant Design(以下用Antd表示)的项目,在对于自己封装的,或者基于Antd封装的公共组件的自动化测试技术的选型和实践. 背景 随着前端项目越来越大,业务逻辑日益繁杂,协 ...
- h5 plus/h5+规范使用,模块索引,教你如何去看h5+的手册
最近看了下h5+规范的官网,开始觉得晦涩难懂,确实很乱,不过这也是基于我不理解的情况,终于艰难读完了,现在来分享下心得吧,基本看完文章,按我的方法,应该可以直接上手项目. 我准备的工具 hbuilde ...