题目链接

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. Principal components analysis(PCA):主元分析

    在因子分析(Factor analysis)中,介绍了一种降维概率模型,用EM算法(EM算法原理详解)估计参数.在这里讨论另外一种降维方法:主元分析法(PCA),这种算法更加直接,只需要进行特征向量的 ...

  2. shell-检测服务是否运行,并记日志

    目的:每隔*分钟检测服务是否运行:若运行中,则记录执行的进程名称:若不运行,记录当前时间 shell: #!/bin/bash date=`date +%Y%m%d` log=/home/mono_$ ...

  3. Linux内存管理1---内存寻址

    1.前言 本文所述关于内存管理的系列文章主要是对陈莉君老师所讲述的内存管理知识讲座的整理. 本讲座主要分三个主题展开对内存管理进行讲解:内存管理的硬件基础.虚拟地址空间的管理.物理地址空间的管理. 本 ...

  4. springboot系列十一、redisTemplate和stringRedisTemplate对比、redisTemplate几种序列化方式比较

    一.redisTemplate和stringRedisTemplate对比 RedisTemplate看这个类的名字后缀是Template,如果了解过Spring如何连接关系型数据库的,大概不会难猜出 ...

  5. pl sql 存储过程 执行sql 锁死状态

    背景 这是在一个不知如何表达的项目中,我在这个项目中做的就是不知如何表达的事情.只是想着技术,到是通过这个项目把存储过程基本能用的都用了,oracle开发的技术我感觉基本都全活了.别人没搞定的我搞定了 ...

  6. javascrip学习之 数据类型和变量

    JavaScript 是脚本语言.是一种轻量级的编程语言.是可插入 HTML 页面的编程代码,可由所有的现代浏览器执行. JavaScript的语法和Java语言类似,每个语句以;结束,语句块用{.. ...

  7. centos6.5/centos7安装部署企业内部知识管理社区系统wecenter

    企业内部知识系统wecenter社区系统安装及部署 centos 6.5环境安装 因为是公司内部使用在线人数不会太多,使用yum安装lamp环境即可 1.安装lamp基本环境 yum -y insta ...

  8. tomcat多项目

    在一个tomcat下面布置2个项目 项目的访问路径: http://localhost:8081/ http://localhost:8082/ 1.建立两个站点(虚拟目录,目录中必须包含必要的配置文 ...

  9. Ubungu 18.04安装MySQL 5.7.24

    Ubuntu 18.04,mysql Ver 14.14 Distrib 5.7.24, for Linux (x86_64), USERNAME@USERNAME-VirtualBox:~$ sud ...

  10. jQuery版本的jsonp

    1.一个众所周知的问题,Ajax直接请求普通文件存在跨域无权限访问的问题,甭管你是静态页面.动态网页.web服务.WCF,只要是跨域请求,一律不准: 2.不过我们又发现,Web页面上调用js文件时则不 ...