题目链接

loj#2552. 「CTSC2018」假面

题解

本题严谨的证明了我菜的本质

对于砍人的操作好做找龙哥就好了,blood很少,每次暴力维护一下

对于操作1

设\(a_i\)为第i个人存活的概率,\(d_i\)为死掉的概率,\(g_{i,j}\)是除i以外活了j个人的概率

那个选中i人的答案就是

\[a_i\times\sum_{j = 0} ^{k - 1}\frac{g_{i,j}}{j + 1}
\]

对于\(g_{i,j}\) ,设\(f_{i,j}\)表示前\(i\)个人有\(j\)个活着的概率,\(f_{i,j}\)可以dp出来

\[f_{i,j} = f_{i - 1,j} \times d_i + f_{i - 1,j - 1} \times a_i
\]

我们可以枚举每次\(g_{i,j}\)的i,然后skip掉,这样的复杂度是\(n^3\)的

然后就可以前缀后缀背包卷积NTT,或者单点删除的分治做法hhhhhhh

其实这个被背包删除物品可以做O(n)

逆着推一下就好了

代码


#include<cstdio>
#include<cstring>
#include<algorithm>
inline int read() {
int x = 0,f = 1;
char c = getchar();
while(c < '0' || c > '9') c = getchar();
while(c <= '9' && c >= '0') x = x * 10 + c - '0' ,c = getchar();
return x * f;
}
const int mod = 998244353;
const int maxn = 2007;
long long b[maxn];
int n,m ;
long long p[maxn][maxn];
long long inv[maxn];
inline int add(int x,int y) {
return x + y >= mod ? x + y - mod : x + y;
}
inline int fstpow(int x,int k) {
int ret = 1;
for(;k;k >>= 1,x = 1ll *x * x % mod)
if(k & 1) ret = 1ll * ret * x % mod;
return ret;
}
void solve1(int x,int P) {
int rp = 1 + mod - P;
for(int i = 0;i <= b[x];++ i) {
if(i) p[x][i] = 1ll * p[x][i] * rp % mod;
if(i < b[x]) p[x][i] = add(p[x][i] , 1ll * p[x][i + 1] * P % mod) ;
}
}
int k;
void solve(int k) {
static long long f[maxn],g[maxn],h[maxn],t[maxn];
// f存活j个人的概率
memset(f,0,sizeof f);
f[0] = 1;
for(int i = 1;i <= k;++ i) t[i] = read();
for(int a,d,i = 1;i <= k;++ i) {
a = 1 + mod - p[t[i]][0];
d = p[t[i]][0];
for(int j = i;j >= 0;-- j)
f[j] = add((j ? 1ll * f[j - 1] * a % mod : 0) , 1ll * f[j] * d % mod);
}
for(int i = 1;i <= k;++ i) {
h[i] = 0;
int a = 1 + mod - p[t[i]][0];
if(!p[t[i]][0])
for(int j = 0;j < k;++ j) h[i] = add(h[i],1ll * f[j + 1] * inv[j + 1] % mod);
else {
int Inv = fstpow(p[t[i]][0],mod - 2);
for(int j = 0;j < k;++ j) {
g[j] = ((f[j] - (j ? 1ll * g[j - 1] * a % mod : 0) + mod) % mod) * Inv % mod;
h[i] = add(h[i],1ll * g[j] * inv[j + 1] % mod);
}
}
h[i] = 1ll * h[i] * a % mod;
}
for(int i = 1;i <= k;++ i) printf("%d ",h[i]);
puts("");
}
main() {
//freopen("facel5.in","r",stdin); freopen("w.out","w",stdout);
n = read();
for(int i = 1;i <= n;++ i) b[i] = read(), p[i][b[i]] = 1,inv[i] = fstpow(i,mod - 2);
m = read();
for(int op,i = 1;i <= m;i += 1) {
op = read();
if(!op) {
int x = read(),u = read(),v = read();
solve1(x,1ll * u * fstpow(v,mod - 2) % mod);
}
else
solve(read());
} for(int i = 1;i <= n;++ i) {
int sum = 0;
for(int j = 1;j <= b[i];++ j)
sum = add(sum , 1ll * j * p[i][j] % mod) ;
printf("%d%c",sum,i != n ? ' ' : '\n');
}
return 0;
}

loj#2552. 「CTSC2018」假面的更多相关文章

  1. LOJ 2552 「CTSC2018」假面——DP

    题目:https://loj.ac/problem/2552 70 分就是 f[i][j] 表示第 i 个人血量为 j 的概率.这部分是 O( n*Q ) 的:g[i][j][0/1] 表示询问的人中 ...

  2. LOJ#2552. 「CTSC2018」假面(期望 背包)

    题意 题目链接 Sol 多年以后,我终于把这题的暴力打出来了qwq 好感动啊.. 刚开始的时候想的是: 设\(f[i][j]\)表示第\(i\)轮, 第\(j\)个人血量的期望值 转移的时候若要淦这个 ...

  3. Loj #2554. 「CTSC2018」青蕈领主

    Loj #2554. 「CTSC2018」青蕈领主 题目描述 "也许,我的生命也已经如同风中残烛了吧."小绿如是说. 小绿同学因为微积分这门课,对"连续"这一概 ...

  4. Loj #2553. 「CTSC2018」暴力写挂

    Loj #2553. 「CTSC2018」暴力写挂 题目描述 temporaryDO 是一个很菜的 OIer .在 4 月,他在省队选拔赛的考场上见到了<林克卡特树>一题,其中 \(k = ...

  5. LOJ 2553 「CTSC2018」暴力写挂——边分治+虚树

    题目:https://loj.ac/problem/2553 第一棵树上的贡献就是链并,转化成 ( dep[ x ] + dep[ y ] + dis( x, y ) ) / 2 ,就可以在第一棵树上 ...

  6. LOJ 2557 「CTSC2018」组合数问题 (46分)

    题目:https://loj.ac/problem/2557 第一个点可以暴搜. 第三个点无依赖关系,k=3,可以 DP .dp[ cr ][ i ][ j ] 表示前 cr 个任务.第一台机器最晚完 ...

  7. LOJ 2555 「CTSC2018」混合果汁——主席树

    题目:https://loj.ac/problem/2555 二分答案,在可以选的果汁中,从价格最小的开始选. 按价格排序,每次可以选的就是一个前缀.对序列建主席树,以价格为角标,维护体积和.体积*价 ...

  8. LOJ 2554 「CTSC2018」青蕈领主——结论(思路)+分治FFT

    题目:https://loj.ac/problem/2554 一个“连续”的区间必然是一个排列.所有 r 不同的.len 最长的“连续”区间只有包含.相离,不会相交,不然整个是一个“连续”区间. 只有 ...

  9. LOJ #2533. 「CTSC2018」暴力写挂(边分治合并)

    题意 给你两个有 \(n\) 个点的树 \(T, T'\) ,求一对点对 \((x, y)\) 使得 \[ depth(x) + depth(y) - (depth(LCA(x , y)) + dep ...

随机推荐

  1. Jetson tk1 刷机教程

    前期准备: 1.  Jetson TK1开发板. 2.  安装有ubuntu系统的PC(或者ubuntu虚拟机)切记:不管是PC还是虚拟机,务必确保有大于5G的存储空间,之后安装过程会作详细解释. 3 ...

  2. 数组Array的一些方法

    数组对象属性和方法的概述:1> arr.push() 将参数添加至数组的末尾,返回的是新数组的长度2> arr.unshift() 将参数添加到数组的开头,返回新数组的长度3> ar ...

  3. linux中fork()函数详解【转】

    转自:http://blog.csdn.net/jason314/article/details/5640969 一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过 ...

  4. centos中进程管理工具

    进程管理:  二进制的格式为ELF,是CPU指令集中的指令  程序=指令+数据,  进程是程序的副本,可以有多个  内核是一个资源调度监视器  Linux是抢占式多任务  内存被事先划分成多个相同大小 ...

  5. [学习笔记]Javascript可选的分号

    1.前言 由于Javascript有自动识别一句语句的结尾,但是缺少必要分号作为结尾符,会降低代码的可读性和整洁性.通过javascript权威指南By淘宝前端团队译,这分号还算比较好玩的. 2.样例 ...

  6. Python-CSS高级 题目

    一.简答1.完整总结display三种基础显示方式的显示方式与嵌套规则 /* inline */ /*1.同行显示, 就相当于纯文本, 当一行显示不下, 如就是一个字显示不下,那么显示不下的那一个字就 ...

  7. OCM_第十天课程:Section5—》数据仓库

    注:本文为原著(其内容来自 腾科教育培训课堂).阅读本文注意事项如下: 1:所有文章的转载请标注本文出处. 2:本文非本人不得用于商业用途.违者将承当相应法律责任. 3:该系列文章目录列表: 一:&l ...

  8. python通过Cookie跳过登录验证码

    1.通过浏览器获取登录cookie,找到重要的两个参数“BAIDUID”和“BDUSS”: 2.编写Selenium自动化测试脚本,跳过登录. from selenium import webdriv ...

  9. hdu1698

    /*区间更新*/#include <cstdio> #include <algorithm> using namespace std; #define lson l , m , ...

  10. python3 + selenium 运行过程中进行截图

    使用driver.get_screenshot_as_file方法("D:/aaac.png")括号中为需要存放的路径及图片名称 from selenium import webd ...