Address

  • 洛谷 P5405
  • LOJ #3124

Solution

  • 先考虑如果以某个点(下面定为 111 )为根时,如果所有的限制二元组 (u,v)(u,v)(u,v) 都满足 uuu 是 vvv 的父亲(即 uuu 向 vvv 连边构成外向树)怎么做
  • 显然,对于任意一个点 uuu , uuu 必须是在 uuu 的子树内第一个被翻到的
  • 如果每个点的 WWW 已经确定,则这个概率就等于
  • ∏u=1nWu∑v∈subtree(u)Wv\prod_{u=1}^n\frac{W_u}{\sum_{v\in subtree(u)W_v}}u=1∏n​∑v∈subtree(u)Wv​​Wu​​
  • 容易设计一个 DP 状态
  • f[u][i]f[u][i]f[u][i] 表示 uuu 的子树内的点全部满足条件,并且这些点的 WWW 之和为 iii 的概率
  • 如果只有一个点,则
  • f[u][i]=pu,ipu,1+pu,2+pu,3f[u][i]=\frac{p_{u,i}}{p_{u,1}+p_{u,2}+p_{u,3}}f[u][i]=pu,1​+pu,2​+pu,3​pu,i​​
  • 边 (u,v)(u,v)(u,v) 合并两个连通块
  • f[u][i+j]+=ii+j×f′[u][i]×f[v][j]f[u][i+j]+=\frac i{i+j}\times f'[u][i]\times f[v][j]f[u][i+j]+=i+ji​×f′[u][i]×f[v][j]
  • 这里 ii+j\frac i{i+j}i+ji​ 表示 uuu 子树内的 WWW 之和由 iii 变成 i+ji+ji+j 时对应概率的分母也需要变化
  • 答案显然为 ∑i=13nf[1][i]\sum_{i=1}^{3n}f[1][i]∑i=13n​f[1][i]
  • 根据某经典的树形背包复杂度分析,以上算法复杂度为 O(n2)O(n^2)O(n2)
  • 回到原问题,不是外向树的情况,考虑容斥
  • 也就是说,每条反向边,我们有两种处置方法
  • (1)不计这条边的限制,即把这条边删掉
  • (2)强行让这条边的限制变为正向
  • 对每条反向边进行这两种处理后共 2反向边条数2^{反向边条数}2反向边条数 种情况
  • 在每种情况下,对分离出的每个连通块求一下概率并相乘
  • 如果这种情况种强心变为正向的反向边有偶数条则计入答案,否则从答案中扣除
  • 这样我们有了一个 O(2反向边条数×n2)O(2^{反向边条数}\times n^2)O(2反向边条数×n2) 的优秀做法
  • 我们考虑把容斥的过程放进 DP 里
  • f[u][i]f[u][i]f[u][i] 表示 iii 的子树,把子树内的反向边进行处理的所有情况下,子树内所有连通块符合要求,并且 uuu 所在连通块的 WWW 之和为 iii 的概率,偶数条反向边进行(2)处理则计入否则扣除得到的结果
  • 边界相同
  • 如果 (u,v)(u,v)(u,v) 不是反向边,还是一样
  • f[u][i+j]+=ii+j×f′[u][i]×f[v][j]f[u][i+j]+=\frac i{i+j}\times f'[u][i]\times f[v][j]f[u][i+j]+=i+ji​×f′[u][i]×f[v][j]
  • 否则
  • f[u][i]+=f′[u][i]×f[v][j]f[u][i]+=f'[u][i]\times f[v][j]f[u][i]+=f′[u][i]×f[v][j]
  • f[u][i+j]−=ii+j×f′[u][i]×f[v][j]f[u][i+j]-=\frac i{i+j}\times f'[u][i]\times f[v][j]f[u][i+j]−=i+ji​×f′[u][i]×f[v][j]
  • 答案还是
  • ∑i=13nf[1][i]\sum_{i=1}^{3n}f[1][i]i=1∑3n​f[1][i]
  • O(n2)O(n^2)O(n2)

Code

#include <bits/stdc++.h>template <class T>
inline void read(T &res)
{res = 0; bool bo = 0; char c;while (((c = getchar()) < '0' || c > '9') && c != '-');if (c == '-') bo = 1; else res = c - 48;while ((c = getchar()) >= '0' && c <= '9')res = (res << 3) + (res << 1) + (c - 48);if (bo) res = ~res + 1;
}const int N = 1005, L = 2005, M = 3005, E = 3e6 + 5, ZZQ = 998244353;int n, a[N][4], inv[E], ecnt, nxt[L], adj[N], go[L], col[L], f[N][M], sze[N],
tmp[M], ans;void add_edge(int u, int v)
{nxt[++ecnt] = adj[u]; adj[u] = ecnt; go[ecnt] = v; col[ecnt] = 0;nxt[++ecnt] = adj[v]; adj[v] = ecnt; go[ecnt] = u; col[ecnt] = 1;
}void dfs(int u, int fu)
{sze[u] = 1;int fr = inv[a[u][1] + a[u][2] + a[u][3]];for (int i = 1; i <= 3; i++)f[u][i] = 1ll * i * a[u][i] * fr % ZZQ;for (int e = adj[u], v; e; e = nxt[e]){if ((v = go[e]) == fu) continue;dfs(v, u);for (int i = 1; i <= (sze[u] + sze[v]) * 3; i++) tmp[i] = 0;for (int i = 1; i <= sze[u] * 3; i++)for (int j = 1; j <= sze[v] * 3; j++){int delta = 1ll * f[u][i] * f[v][j] % ZZQ;if (col[e]) tmp[i + j] = (tmp[i + j] - delta + ZZQ) % ZZQ,tmp[i] = (tmp[i] + delta) % ZZQ;else tmp[i + j] = (tmp[i + j] + delta) % ZZQ;}sze[u] += sze[v];for (int i = 1; i <= sze[u] * 3; i++) f[u][i] = tmp[i];}for (int i = 1; i <= sze[u] * 3; i++)f[u][i] = 1ll * f[u][i] * inv[i] % ZZQ;
}int main()
{int x, y;read(n);for (int i = 1; i <= n; i++)for (int j = 1; j <= 3; j++)read(a[i][j]);for (int i = 1; i < n; i++)read(x), read(y), add_edge(x, y);inv[1] = 1;for (int i = 2; i <= 3000000; i++)inv[i] = 1ll * (ZZQ - ZZQ / i) * inv[ZZQ % i] % ZZQ;dfs(1, 0);for (int i = 1; i <= n * 3; i++)ans = (ans + f[1][i]) % ZZQ;return std::cout << ans << std::endl, 0;
}
```

[LOJ#3124][CTS2019]氪金手游(概率 + 树形 DP + 容斥)相关推荐

  1. P5405-[CTS2019]氪金手游【树形dp,容斥,数学期望】

    前言 话说在LojLojLoj下了个数据发现这题的名字叫fgofgofgo 正题 题目链接:https://www.luogu.com.cn/problem/P5405 题目大意 nnn张卡的权值为1 ...

  2. LOJ 3124 「CTS2019 | CTSC2019」氪金手游——概率+树形DP

    题目:https://loj.ac/problem/3124 看了题解:https://www.cnblogs.com/Itst/p/10883880.html 先考虑外向树. 考虑分母是 \( \s ...

  3. [CTS2019]氪金手游 概率Dp,树形Dp,容斥原理

    [CTS2019]氪金手游 题目传送门: luogu 分析 先考虑一下那个奇怪的条件(都知道是哪个吧) 它实际上是说,整个结构形成了一棵树. 但是这棵树很奇怪,边有顺的也有反的. 先考虑全是顺的边的情 ...

  4. LOJ3124 CTS2019 氪金手游 概率、容斥、树形DP

    传送门 D2T3签到题可真是IQ Decrease,概率独立没想到然后就20pts滚粗了 注意题目是先对于所有点rand一个权值\(w\)然后再抽卡. 先考虑给出的关系是一棵外向树的情况.那么我们要求 ...

  5. P5405 [CTS2019]氪金手游 【数学概率+树形dp】

    P5405 [CTS2019]氪金手游 [数学概率+树形dp] 先考虑外向树的情况: 这个的关键是要把求满足拓扑序的概率转化为求 每个点都比它的子树中的所有节点先取到的概率 .单个节点 xxx 的概率 ...

  6. Luogu5405 CTS2019氪金手游(容斥原理+树形dp)

    考虑外向树怎么做.显然设f[i][j]为i子树中出现权值和为j的合法方案的概率,转移做树形背包即可. 如果树上只有一条反向边,显然可以先不考虑该边计算概率,再减去将整棵树看做外向树的概率.于是考虑容斥 ...

  7. [LOJ#3119][Luogu5405][CTS2019]氪金手游(DP+容斥)

    先考虑外向树的做法,显然一个点在其子树内第一个出现的概率等于它的权值除以它子树的权值和.于是f[i][j]表示i的子树的权值和为j时,i子树内所有数的相互顺序都满足条件的概率,转移直接做一个背包卷积即 ...

  8. [CTS2019]氪金手游

    https://www.luogu.org/problemnew/show/P5405 题解 首先考虑一条链的情况. \(O->O->O->O->O\) 比如说这样一条链. 每 ...

  9. 题解-CTS2019氪金手游

    Problem \(\mathtt {loj-3124}\) 题意概要:给定 \(n\) 个点,\(w_i\) 分别有 \(p_{i,1},p_{i,2},p_{i,3}\) 的概率取 \(1,2,3 ...

最新文章

  1. 【引用】JS刷新当前页面
  2. 软件测试中的α测试、β测试和λ测试
  3. HDU - 2874 Connections between cities(并查集+LCA)
  4. Ext.form.field.ComboBox组合框
  5. oracle 判断是否位汉字,js判断字符是否是汉字的两种方法小结
  6. Intel Sandy Bridge/Ivy Bridge架构/微架构/流水线 (15) - L1数据缓存/读写地址转换
  7. sharepoint 2013/2010/2007 复制工具:SharePoint Content Deployment Wizard
  8. pandas.DataFrame.rank
  9. Mac 启动 linux 可执行文件。
  10. 数字人民币渐行渐近丨2021中国区块链产业发展报告
  11. 基础篇:源码 Linux+Apache+PHP+MySQL环境配置方法-08CMS网站
  12. 小说app源码,uni-app跨平台框架开发,一套代码双端运行,无差别
  13. 国内开源镜像站地址汇总
  14. timestamp 与 nonce 防止重放攻击
  15. python保存对话框_python打开文件对话框的方法
  16. 十足的跳槽理由有哪些?
  17. 计算机基础教育对工科学生的意义,深入进行高校工科非计算机专业计算机基础教育改革…...
  18. FPGA error:buffers of the same direction cannot be placed in series.
  19. 去除噪声 matlab 论文,基于MATLAB的语音去噪开题报告
  20. 【锐捷无线】定时开关无线信号配置

热门文章

  1. morris算法(莫里斯遍历) [数据结构与算法]
  2. 赵俊峰内蒙古大学计算机学院,内蒙古大学计算机学院研究生导师:赵俊峰
  3. Qt串口通信实时曲线上位机源代码
  4. 第二章 VB的界面设计
  5. python3进阶之正则表达式之re模块之分组(group)、贪心匹配、编译
  6. 港科夜闻|全国政协副主席梁振英先生率香港商企及机构代表一行到莅临香港科大(广州)访问交流...
  7. IT行业的各岗位职责[转]
  8. 一文说透hive中的分桶及抽样查询
  9. linux系统安全与日志分析
  10. 数位dp算法——洛谷p1980