[LOJ#3119][Luogu5405][CTS2019]氪金手游(DP+容斥)
先考虑外向树的做法,显然一个点在其子树内第一个出现的概率等于它的权值除以它子树的权值和。于是f[i][j]表示i的子树的权值和为j时,i子树内所有数的相互顺序都满足条件的概率,转移直接做一个背包卷积即可。
现在考虑反向边,通过容斥变成“至少有i条边不满足条件”的满足题目条件的概率,这样一来那些反向边会有一部分被变为正向边,另一部分被删除。如果枚举哪些边被反向的话可以做到$O(2^nn^2)$。但事实上我们并不关心具体是哪些边被反向了,而只关心有多少边被反向了。于是自然有一个方程f[i][j][k]表示i的子树的权值和为j,有k条边被反向的满足条件的概率。再注意到最后一维也是可以不要的,因为我们可以在DP过程中就计入容斥系数。感性理解,当一条从儿子连过来的边被反向时,它在最终结果中的系数一定与当前点的子树的系数相反,而当一条边被删除时,它的子树与当前点的子树之间独立,且最终系数与当前点的系数相同。复杂度$O(n^2)$,具体转移见代码。
1 #include<cstdio> 2 #include<algorithm> 3 #define rep(i,l,r) for (int i=(l); i<=(r); i++) 4 #define For(i,x) for (int i=h[x],k; i; i=nxt[i]) 5 typedef long long ll; 6 using namespace std; 7 8 const int N=3010,mod=998244353,inf=1e9; 9 int n,rt,ans,cnt,u,v,inv[N],a[N],b[N],c[N],s[N],f[N][N],sz[N],g[N],h[N],to[N],val[N],nxt[N]; 10 11 void add(int u,int v,int w){ to[++cnt]=v; val[cnt]=w; nxt[cnt]=h[u]; h[u]=cnt; } 12 void inc(int &x,int y){ x=(x+y>=mod) ? x+y-mod : x+y; } 13 void dec(int &x,int y){ x=(x-y<0) ? x-y+mod : x-y; } 14 15 int ksm(int a,int b){ 16 int res=1; 17 for (; b; a=1ll*a*a%mod,b>>=1) 18 if (b & 1) res=1ll*res*a%mod; 19 return res; 20 } 21 22 void dfs(int x,int fa){ 23 sz[x]=1; 24 f[x][1]=1ll*a[x]*s[x]%mod; 25 f[x][2]=2ll*b[x]*s[x]%mod; 26 f[x][3]=3ll*c[x]*s[x]%mod; 27 For(z,x) if ((k=to[z])!=fa){ 28 dfs(k,x); 29 rep(i,1,sz[x]*3) rep(j,1,sz[k]*3){ 30 int t=1ll*f[x][i]*f[k][j]%mod; 31 if (val[z]) dec(g[i+j],t),inc(g[i],t); else inc(g[i+j],t); 32 } 33 sz[x]+=sz[k]; 34 rep(i,1,sz[x]*3) f[x][i]=g[i],g[i]=0; 35 } 36 rep(i,1,sz[x]*3) f[x][i]=1ll*f[x][i]*inv[i]%mod; 37 } 38 39 int main(){ 40 freopen("fgo.in","r",stdin); 41 freopen("fgo.out","w",stdout); 42 scanf("%d",&n); 43 rep(i,1,3*n) inv[i]=ksm(i,mod-2); 44 rep(i,1,n) scanf("%d%d%d",&a[i],&b[i],&c[i]),s[i]=ksm(a[i]+b[i]+c[i],mod-2); 45 rep(i,2,n) scanf("%d%d",&u,&v),add(u,v,0),add(v,u,1); 46 dfs(1,1); 47 rep(i,1,sz[1]*3) inc(ans,f[1][i]); 48 printf("%d\n",ans); 49 return 0; 50 }
转载于:https://www.cnblogs.com/HocRiser/p/10904447.html
[LOJ#3119][Luogu5405][CTS2019]氪金手游(DP+容斥)相关推荐
- [CTS2019]氪金手游(容斥+树形背包DP)
降智好题.本蒟蒻VP时没想到怎么做被题面迷惑了,只会20分的"好"成绩.简直自闭了. 首先显然度为0的点是白给的,根据等比数列求和公式即可求得.然后考虑这个树如果是一颗外向树,就是 ...
- Luogu5405 CTS2019氪金手游(容斥原理+树形dp)
考虑外向树怎么做.显然设f[i][j]为i子树中出现权值和为j的合法方案的概率,转移做树形背包即可. 如果树上只有一条反向边,显然可以先不考虑该边计算概率,再减去将整棵树看做外向树的概率.于是考虑容斥 ...
- P5405 [CTS2019]氪金手游 【数学概率+树形dp】
P5405 [CTS2019]氪金手游 [数学概率+树形dp] 先考虑外向树的情况: 这个的关键是要把求满足拓扑序的概率转化为求 每个点都比它的子树中的所有节点先取到的概率 .单个节点 xxx 的概率 ...
- [CTS2019]氪金手游 概率Dp,树形Dp,容斥原理
[CTS2019]氪金手游 题目传送门: luogu 分析 先考虑一下那个奇怪的条件(都知道是哪个吧) 它实际上是说,整个结构形成了一棵树. 但是这棵树很奇怪,边有顺的也有反的. 先考虑全是顺的边的情 ...
- [LOJ#3124][CTS2019]氪金手游(概率 + 树形 DP + 容斥)
Address 洛谷 P5405 LOJ #3124 Solution 先考虑如果以某个点(下面定为 111 )为根时,如果所有的限制二元组 (u,v)(u,v)(u,v) 都满足 uuu 是 vvv ...
- LOJ3124 CTS2019 氪金手游 概率、容斥、树形DP
传送门 D2T3签到题可真是IQ Decrease,概率独立没想到然后就20pts滚粗了 注意题目是先对于所有点rand一个权值\(w\)然后再抽卡. 先考虑给出的关系是一棵外向树的情况.那么我们要求 ...
- [CTS2019]氪金手游
https://www.luogu.org/problemnew/show/P5405 题解 首先考虑一条链的情况. \(O->O->O->O->O\) 比如说这样一条链. 每 ...
- 题解-CTS2019氪金手游
Problem \(\mathtt {loj-3124}\) 题意概要:给定 \(n\) 个点,\(w_i\) 分别有 \(p_{i,1},p_{i,2},p_{i,3}\) 的概率取 \(1,2,3 ...
- CTS2019 氪金手游
题目链接 考虑我们现在只会外向树的dp,现在想办法如何处理反向的边. 考虑容斥,计算至少有\(i\)条边不合法的情况,容斥系数是\((-1)^i\) 这个容斥可以用dp来做,这题就完了. 代码 #in ...
最新文章
- L3-010. 是否完全二叉搜索树
- css响应式布局_Web前端新手怎么入门 如何用CSS做响应式布局
- java复制文件_java多种文件复制方式以及效率比较
- 家用简单电线路图_家庭配电箱接线图解 家用配电箱安装方法
- jquery动画 -- 1.加载指示器
- CentOS7 防火墙规则 (firewalld)
- mysql sync es 异步双写_mysql数据同步es方案思考
- 你需掌握的CSS知识都在这了(长文建议收藏,文末有福利)
- [转]hexo 博客开启 https (SSL 证书)
- C语言之指针本身地址与指针向的地址(四十四)
- Web安全深度剖析-笔记
- php vampsever,歌曲 Cheater MP3,在线试听,下载 The Vamps 外语歌曲网
- oracle11 ssd 补丁,新装Oracle 11gR2 11.2.0.2重要说明——Patchset p10098816(附补丁下载地址).docx...
- android仿饿了么,Android 仿饿了么下拉Dialog
- 怎么制作GIF高清动态表情包
- Axure,Justinmind以及Mockplus的交互设置方式对比
- CSI笔记【3】:多进多出/MIMO技术
- php获取时间星期几,php 获取当天或某个日期是星期几
- MacOS解压rar文件
- 招银网络科技java春招二面_招银网络科技 2019春招笔试题复盘