题目:https://loj.ac/problem/2552

70 分就是 f[i][j] 表示第 i 个人血量为 j 的概率。这部分是 O( n*Q ) 的;g[i][j][0/1] 表示询问的人中,前/后 i 个人,存活 j 个人的概率。做 g[ ][ ] 是 n^2 的,算答案是 n3 的。

考虑 g[ i ] 表示询问的人中有 i 个存活的概率。因为每个人加入 g[ ] 的顺序无关,所以可以每次 O(n) 地从g[ ] 里剔除第 i 个人的贡献。

令第 i 个人不存活的概率是 u ,存活的概率是 v 。

当初的转移是 g[ i ] * u -> g'[ i ] , g[ i ] * v -> g'[ i+1 ] ,所以现在可以倒着做:g[ i ] = g'[ i+1 ] / v , g'[ i ] -= g[ i ] ,或者正着做:g[ i ] = g'[ i ] / u , g'[ i+1 ] -= g[ i ] * v 。

发现如果 u=0 ,那么 g[ i ] 的值只体现在了 g'[ i+1 ] 里;所以倒着做。如果 v=0 就正着做。

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
int rdn()
{
int ret=;bool fx=;char ch=getchar();
while(ch>''||ch<''){if(ch=='-')fx=;ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return fx?ret:-ret;
}
const int N=,M=,mod=;
int upt(int x){while(x>=mod)x-=mod;while(x<)x+=mod;return x;}
int pw(int x,int k)
{int ret=;while(k){if(k&)ret=(ll)ret*x%mod;x=(ll)x*x%mod;k>>=;}return ret;} int n,a[N],f[N][M],g[N],tp[N],h[N],q[N],inv[N];
int main()
{
n=rdn(); inv[]=;
for(int i=;i<=n;i++)inv[i]=(ll)upt(-mod/i)*inv[mod%i]%mod;
for(int i=,d;i<=n;i++)
{ a[i]=rdn();f[i][a[i]]=;}
int Q=rdn(),op,x,u,v;
while(Q--)
{
op=rdn();
if(!op)
{
x=rdn();u=rdn();v=rdn();
u=(ll)u*pw(v,mod-)%mod;
for(int j=;j<=a[x];j++)
{
f[x][j-]=(f[x][j-]+(ll)f[x][j]*u)%mod;
f[x][j]=(ll)f[x][j]*upt(-u)%mod;
}
if(!f[x][a[x]])a[x]--;
}
else
{
x=rdn(); int tl=;
for(int i=;i<=x;i++)
q[++tl]=rdn();
g[]=;for(int i=;i<=tl;i++)g[i]=;
for(int i=;i<=tl;i++)
{
u=f[q[i]][]; v=upt(-u);
for(int j=i;j>=;j--)
{
g[j]=(ll)g[j]*u%mod;
if(j)g[j]=(g[j]+(ll)g[j-]*v)%mod;
}
}
for(int i=;i<=tl;i++)
{
u=f[q[i]][]; v=upt(-u);
memcpy(tp,g,sizeof g);
if(!u)
{
int iv=pw(v,mod-);
for(int j=tl-;j>=;j--)
{
h[j]=(ll)tp[j+]*iv%mod;
tp[j]=upt((tp[j]-(ll)u*h[j])%mod);
}
}
else
{
int iu=pw(u,mod-);
for(int j=;j<tl;j++)
{
h[j]=(ll)tp[j]*iu%mod;
tp[j+]=upt((tp[j+]-(ll)v*h[j])%mod);
}
}
int ans=;
for(int j=;j<tl;j++)
ans=(ans+(ll)h[j]*v%mod*inv[j+])%mod;
printf("%d ",ans);
}
puts("");
}
}
for(int i=;i<=n;i++)
{
int ans=;
for(int j=;j<=a[i];j++)
ans=(ans+(ll)j*f[i][j])%mod;
printf("%d ",ans);
}
puts(""); return ;
}

LOJ 2552 「CTSC2018」假面——DP的更多相关文章

  1. loj#2552. 「CTSC2018」假面

    题目链接 loj#2552. 「CTSC2018」假面 题解 本题严谨的证明了我菜的本质 对于砍人的操作好做找龙哥就好了,blood很少,每次暴力维护一下 对于操作1 设\(a_i\)为第i个人存活的 ...

  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. 「CTSC2018」假面

    真~签到题qwq 昨天在考场上先写了个70分暴力dp,然后发现好像可以优化.因为结界技能的模型相当于要求出 对于每个物品,仅仅不选它的背包是什么....  于是当场脑补出两种做法: 前缀和后缀背包卷积 ...

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

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

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

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

随机推荐

  1. 10.16 ln软硬链接的创建等

    ln make links between files 无参数  创建硬链接 -s 创建软连接 ln option 源文件 目标文件 #相反的: tar 目标文件 源文件 [root@wen test ...

  2. Minimal Power of Prime

    题目链接 题意:输入n,求所有质因子幂的最小值.n奇大无比. 思路:先对n所有n开五次方根的质因子约完,然后如果没有除尽的话,因子最多也就4个了,所以幂数大于1的情况有p1^4,p1^3, p1^2  ...

  3. UIStakView的添加与移除

    subView和arrangedSubView对于Stack View的子控件添加和移除,我们是这样描述的. 添加-->(Stack View管理的subview) addArrangedSub ...

  4. BUUCTF | 高明的黑客

    这一题一开始我没有理解"www.tar.gz"的涵义,还以为有一个其他的网站叫这个,后来才突然顿悟他也有可能是一个目录!!!地址栏输入”/www.tar.gz“ 然后就可以得到源码 ...

  5. [CSP-S模拟测试]:壕游戏(费用流)

    题目传送门(内部题18) 输入格式 第一行包括四个数$n,m,k,s$表示有$n$个剧情点,$m$个关卡,要玩$k$次游戏,$s$个完结点接下来一行包含$s$个数,代表$s$个完结点的编号.接下来$m ...

  6. Apache + Tomcat 集群的配置

    公司最近新接了一个项目,客户要求WEB SERVER 必须是APACHE,,由于之前的项目一直都是NGINX,,无奈啊,,由于对方的IT又是在三哥的过度,经过一番的争执只能顺应三哥三姐的要求..

  7. Python 进阶_模块 & 包

    目录 目录 模块的搜索路径和路径搜索 搜索路径 命名空间和变量作用域的比较 变量名的查找覆盖 导入模块 import 语句 from-import 语句 扩展的 import 语句 as 自动载入模块 ...

  8. 【C#学习笔记】 IDisposable 接口

    在.net 编程环境中,系统的资源分为托管资源和非托管资源. 对于托管的资源的回收工作,是不需要人工干预回收的,而且你也无法干预他们的回收,所能够做的只是了解.net CLR如何做这些操作.也就是说对 ...

  9. 斯坦福【概率与统计】课程笔记(二):从EDA开始

    探索性数据分析(Exploratory Data Analysis) 本节课程先从统计分析四步骤中的第二步:EDA开始. 课程定义了若干个术语,如果学习过机器学习的同学,应该很容易类比理解: popu ...

  10. python 装饰器 第五步(1):带有参数的装饰器

    #第五步:带有参数的装饰器 #用于扩展基本函数的函数 def kuozhan(func): #内部函数(扩展之后的eat函数) #5由于调用的时候传了两个参数,未来的eat函数没有参数接收 #5报错的 ...