LINK


思路

首先考虑减血,直接一个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]假面【概率+期望】【思维】的更多相关文章

  1. BZOJ5340: [Ctsc2018]假面

    BZOJ5340: [Ctsc2018]假面 https://lydsy.com/JudgeOnline/problem.php?id=5340 分析: 背包,只需要求\(g_{i,j}\)表示强制活 ...

  2. [CTSC2018]假面(概率DP)

    考场上以为CTSC的概率期望题都不可做,连暴力都没写直接爆零. 结果出来发现全场70以上,大部分AC,少于70的好像极少,感觉血亏. 设a[i][j]表示到当前为止第i个人的血量为j的概率(注意特判血 ...

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

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

  4. 洛谷 P4564 [CTSC2018]假面(期望+dp)

    题目传送门 题意: 有 \(n\) 个怪物,第 \(i\) 个怪物初始血量为 \(m_i\).有 \(Q\) 次操作: 0 x u v,有 \(p=\frac{u}{v}\) 的概率令 \(m_x\) ...

  5. 【BZOJ-1419】Red is good 概率期望DP

    1419: Red is good Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 660  Solved: 257[Submit][Status][Di ...

  6. uvalive 7331 Hovering Hornet 半平面交+概率期望

    题意:一个骰子在一个人正方形内,蜜蜂在任意一个位置可以出现,问看到点数的期望. 思路:半平面交+概率期望 #include<cstdio> #include<cstring> ...

  7. OI队内测试一【数论概率期望】

    版权声明:未经本人允许,擅自转载,一旦发现将严肃处理,情节严重者,将追究法律责任! 序:代码部分待更[因为在家写博客,代码保存在机房] 测试分数:110 本应分数:160 改完分数:200 T1: 题 ...

  8. 2016 多校联赛7 Balls and Boxes(概率期望)

    Mr. Chopsticks is interested in random phenomena, and he conducts an experiment to study randomness. ...

  9. 牛客网多校赛第9场 E-Music Game【概率期望】【逆元】

    链接:https://www.nowcoder.com/acm/contest/147/E 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524 ...

随机推荐

  1. 《剑指offer》第十六题(数值的整数次方)

    // 面试题:数值的整数次方 // 题目:实现函数double Power(double base, int exponent),求base的exponent // 次方.不得使用库函数,同时不需要考 ...

  2. 【Golang】 可以自动生成测试用例的库--gotests

    简介 gotests是一个Golang命令行工具,它可以使编写Go的测试代码变得容易.它能基于目标源文件的函数和方法生成数据驱动测试用例,并且在此过程会自动导入任何依赖. 下面是gotests在使用S ...

  3. flash破解工具/flash decompiler

    如果想比较方便地参观浏览一下flash(swf)文件里面的内容,推荐使用国外免费开源的工具JPEXS Free Flash Decompiler. 传送门:https://www.free-decom ...

  4. angular5 路由传参的几种方式

    此处介绍三种方式 方式一: 问号后面带的参数, 例如:/product?id=1&name=iphone还可以是: [routerLink]="['/books']" [q ...

  5. putty xming gnome-session

    在windows里远程连接linux的最好方法. 比VNC方式好多了 1) xming启动一个窗口 2) putty 设置完X11 forwarding之后,远程登录 3) 在putty 里启动 gn ...

  6. Assert.IsNotNull 方法(判断对象不为NULL)

    Assert.IsNotNull 方法 Visual Studio 2012   其他版本 Visual Studio 2010 Visual Studio 2008 Visual Studio 20 ...

  7. [洛谷P1507]NASA的食物计划 以及 对背包问题的整理

    P1507 NASA的食物计划 题面 每个物品有三个属性,"所含卡路里":价值\(v\),"体积":限制1\(m_1\),以及"质量":限制 ...

  8. amoba读写分离

    原文链接:http://www.abcdocker.com/abcdocker/81 Amoeba(变形虫)项目,该开源框架于2008年 开始发布一款 Amoeba for Mysql软件.这个软件致 ...

  9. antd-pro1.0使用jest对react组件进行单元测试

    前言 基于React+Ant Design(以下用Antd表示)的项目,在对于自己封装的,或者基于Antd封装的公共组件的自动化测试技术的选型和实践. 背景 随着前端项目越来越大,业务逻辑日益繁杂,协 ...

  10. h5 plus/h5+规范使用,模块索引,教你如何去看h5+的手册

    最近看了下h5+规范的官网,开始觉得晦涩难懂,确实很乱,不过这也是基于我不理解的情况,终于艰难读完了,现在来分享下心得吧,基本看完文章,按我的方法,应该可以直接上手项目. 我准备的工具 hbuilde ...