题目链接

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. Qt5.7 无法输入中文问题

    把libfcitxplatforminputcontextplugin.so复制到安装的Qt目录下的两个文件夹中 sudo apt install fcitx-frontend-qt5 sudo cp ...

  2. Hibernate5.4的环境搭建

    (1)项目中添加Hibernate依赖 <dependency> <groupId>org.hibernate</groupId> <artifactId&g ...

  3. eclipse中运行项目出现空白错误提示解决办法

    别人所给出的解决办法:https://blog.csdn.net/fzdg2019/article/details/79384539 两个办法: 方法一:配置环境变量 方法二:修改eclipse安装目 ...

  4. C++:MSVCRTD.lib(crtexe.obj) : error LNK2019: 无法解析的外部符号 _main,该符号在函数 ___tmainCRTStart

    在VS2013中Build一个C++程序报这个错,解决方案如下: 在解决方案管理器中选择该项目,项目/属性/连接器/系统/子系统 把控制台 (/SUBSYSTEM:CONSOLE)改为 窗口 (/SU ...

  5. sqlserver 无法获得数据库独占权

    ALTER DATABASE trqxs_cs SET OFFLINE WITH ROLLBACK IMMEDIATE

  6. Ex 6_14 布料剪裁问题_第八次作业

    子问题定义: 定义p[i][j]为布料宽为i,高为j的最优产出,每次剪下一块布料,剩余布料最多形成三块矩阵面料.每次剪裁会有两种情况,水平切割布料,其次是将布料旋转90度后在切割布料. 递归关系: 初 ...

  7. App调试的几个命令实践【转】

    在Android的应用开发中,我们会用到各种代码调试:其实在Android的开发之后,我们可能会碰到一些随机的问题,如cpu过高,内存泄露等,我们无法简单的进行代码调试,我们需要一个系统日志等等,下面 ...

  8. 每天一个linux命令:scp命令

    scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的.可能会稍微影响一下速度.当你服务器 ...

  9. swift的一些知识点(不断完善中)

    首先,隆重推荐文章http://www.infoq.com/cn/articles/swift-brain-gym-optional swift 烧脑体操!目前有4篇文章,说的都很好! 1. 应该充分 ...

  10. cf343c 二分答案+模拟

    /* 怎么判断能否在时间k内完成扫描 贪心:每次取出最靠左边的磁头去扫描最左边的,然后再往右扫描即可 如果当前点无法扫到最左侧点,那么后继点一样无法扫到 */ #include<bits/std ...