Random Access Iterator

\[Time Limit: 4000 ms \quad Memory Limit: 262144 kB
\]

题意

给出伪代码,问按着伪代码在树上跑,能够正确求出来树的深度的概率。

思路

先在树上 \(dfs\) 一遍,求出每个点可以走到的最深深度,用 \(deep\) 表示。

令 \(dp[i]\) 表示从 \(i\) 节点能够正确求出最深深度的概率。

  1. 如果 \(deep[u]\) 不等于最深深度,那么明显 \(dp[u]=0\)
  2. 如果 \(deep[u]\) 是最深深度而且走到了叶子节点,那么 \(dp[u]=1\)
  3. 其他情况,能够走到最深深度的概率 = \(1\) - 每次走每个点都不能走到最深深度的概率,用表达式表达就是,\(sz\) 表示当前节点可以走的其他节点数,特别注意 \(u=1\) 的情况就可以了。

\[ dp[u] = 1-\left(\frac{\sum_{v}(1-dp[v)}{sz-1}\right)^{sz-1}
\]

  1. /***************************************************************
  2. > File Name : a.cpp
  3. > Author : Jiaaaaaaaqi
  4. > Created Time : Wed 11 Sep 2019 02:48:22 PM CST
  5. ***************************************************************/
  6. #include <map>
  7. #include <set>
  8. #include <list>
  9. #include <ctime>
  10. #include <cmath>
  11. #include <stack>
  12. #include <queue>
  13. #include <cfloat>
  14. #include <string>
  15. #include <vector>
  16. #include <cstdio>
  17. #include <bitset>
  18. #include <cstdlib>
  19. #include <cstring>
  20. #include <iostream>
  21. #include <algorithm>
  22. #include <unordered_map>
  23. #define lowbit(x) x & (-x)
  24. #define mes(a, b) memset(a, b, sizeof a)
  25. #define fi first
  26. #define se second
  27. #define pb push_back
  28. #define pii pair<int, int>
  29. typedef unsigned long long int ull;
  30. typedef long long int ll;
  31. const int maxn = 1e6 + 10;
  32. const int maxm = 1e5 + 10;
  33. const ll mod = 1e9 + 7;
  34. const ll INF = 1e18 + 100;
  35. const int inf = 0x3f3f3f3f;
  36. const double pi = acos(-1.0);
  37. const double eps = 1e-8;
  38. using namespace std;
  39. int n, m;
  40. int cas, tol, T;
  41. int maxdeep;
  42. vector<int> vv[maxn];
  43. int deep[maxn];
  44. ll dp[maxn];
  45. ll fpow(ll a, ll b) {
  46. ll ans = 1;
  47. while(b) {
  48. if(b&1) ans = ans*a%mod;
  49. a = a*a%mod;
  50. b >>= 1;
  51. }
  52. return ans;
  53. }
  54. void dfs(int u, int fa, int d) {
  55. deep[u] = d;
  56. for(auto v : vv[u]) {
  57. if(v == fa) continue;
  58. dfs(v, u, d+1);
  59. deep[u] = max(deep[u], deep[v]);
  60. }
  61. maxdeep = max(maxdeep, deep[u]);
  62. }
  63. void solve(int u, int fa) {
  64. if(deep[u] != maxdeep) {
  65. dp[u] = 0;
  66. return ;
  67. }
  68. if(vv[u].size() == 1) {
  69. dp[u] = 1;
  70. return ;
  71. }
  72. int sz = vv[u].size()-1;
  73. if(u == 1) sz++;
  74. ll ans = 0;
  75. for(auto v : vv[u]) {
  76. if(v == fa) continue;
  77. solve(v, u);
  78. ans += (1-dp[v]+mod);
  79. ans %= mod;
  80. }
  81. ans = ans*fpow(sz, mod-2)%mod;
  82. ans = fpow(ans, sz);
  83. dp[u] = (1-ans+mod)%mod;
  84. }
  85. int main() {
  86. // freopen("in", "r", stdin);
  87. scanf("%d", &n);
  88. for(int i=1; i<=n; i++) {
  89. vv[i].clear();
  90. }
  91. for(int i=1; i<n; i++) {
  92. int u, v;
  93. scanf("%d%d", &u, &v);
  94. vv[u].pb(v);
  95. vv[v].pb(u);
  96. }
  97. maxdeep = 0;
  98. dfs(1, 0, 1);
  99. solve(1, 0);
  100. printf("%lld\n", dp[1]);
  101. return 0;
  102. }

Random Access Iterator 徐州网络赛(树形dp)的更多相关文章

  1. HDU 6201 2017沈阳网络赛 树形DP或者SPFA最长路

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6201 题意:给出一棵树,每个点有一个权值,代表商品的售价,树上每一条边上也有一个权值,代表从这条边经过 ...

  2. hdu 4274 2012长春赛区网络赛 树形dp ***

    设定每个节点的上限和下限,之后向上更新,判断是否出现矛盾 #include<cstdio> #include<iostream> #include<algorithm&g ...

  3. ICPC 2019 徐州网络赛

    ICPC 2019 徐州网络赛 比赛时间:2019.9.7 比赛链接:The Preliminary Contest for ICPC Asia Xuzhou 2019 赛后的经验总结 // 比赛完才 ...

  4. 2019徐州网络赛 I J M

    I. query 比赛时候没有预处理因子疯狂t,其实预处理出来因子是\(O(nlog(n))\)级别的 每个数和他的因子是一对偏序关系,因此询问转化为(l,r)区间每个数的因子在区间(l,r)的个数 ...

  5. 2018 ICPC 徐州网络赛

    2018 ICPC 徐州网络赛 A. Hard to prepare 题目描述:\(n\)个数围成一个环,每个数是\(0\)~\(2^k-1\),相邻两个数的同或值不为零,问方案数. solution ...

  6. 2019icpc徐州网络赛

    A Who is better? 题意 excrt+斐波那契博弈 分析 Java的BigInteger对象默认为null,不能直接比较. 代码 import java.math.BigInteger; ...

  7. Random Access Iterator

    Random Access Iterator 树型概率DP dp[u]代表以当前点作为根得到正确结果的概率 将深度最深的几个点dp[u]很明显是1 然后很简单的转移 有k次,但我们要先看一次的情况,然 ...

  8. 计蒜客 41391.query-二维偏序+树状数组(预处理出来满足情况的gcd) (The Preliminary Contest for ICPC Asia Xuzhou 2019 I.) 2019年徐州网络赛)

    query Given a permutation pp of length nn, you are asked to answer mm queries, each query can be rep ...

  9. [徐州网络赛]Longest subsequence

    [徐州网络赛]Longest subsequence 可以分成两个部分,前面相同,然后下一个字符比对应位置上的大. 枚举这个位置 用序列自动机进行s字符串的下标转移 注意最后一个字符 #include ...

随机推荐

  1. (十五)golang--init函数

    每一个源文件都会包含一个init函数,这个函数会在执行main()执行之前被调用,相当于python中的__init__ 注意细节:(1)如果一个文件同时包含全局变量定义,init函数和main函数, ...

  2. 应用Redis分布式锁解决重复通知的问题

    研究背景: 这几天被支付宝充值后通知所产生的重复处理问题搞得焦头烂额, 一周连续发生两次重复充钱的杯具, 发事故邮件发到想吐..为了挽回程序员的尊严, 我用了Redis的锁机制. 事故场景: 支付宝下 ...

  3. Java 中的"+"号(加法和连接)

    Java 中的"+"号(加法和连接) public class Test { public static void main(String[] args) { System.out ...

  4. 在Button样式中添加EventSetter,理解路由事件

    XML <Window.Resources> <Style x:Key="ButtonStyle2" TargetType="{x:Type Butto ...

  5. 使用eclipse git插件合并merge部分代码方法

    当有一个父项目,它的下面有多个子项目:或者一个项目下边,只想合并部分路径,甚至部分文件的内容,使用下边的方法可以达到目的,特此记录: 1.主项目右键 -> team -> remove f ...

  6. 数据库的dml、ddl和dcl的概念

    学过数据库肯定会知道DML.DDL和DCL这三种语言,这种基础概念性的东西是必须要记住的. DML(Data Manipulation Lanaguage,数据操纵语言) DML就是我们经常用到的SE ...

  7. Linux系统安装snmp服务

    Linux安装snmp详解 Snmp一种网络之间的传输协议,通过snmp可以采集很多指标比如cpu.内存及磁盘的信息,现在越来越多的网络设备基本上都支持snmp,本文介绍了snmp的安装过程. 二.安 ...

  8. SQL IN 一定走索引吗?

    摘要 IN 一定走索引吗?那当然了,不走索引还能全部扫描吗?好像之前有看到过什么Exist,IN走不走索引的讨论.但是好像看的太久了,又忘记了.哈哈,如果你也忘记了MySQL中IN是如何查询的,就来复 ...

  9. Sql 分页语句

    select * from (select *,ROW_NUMBER()over(order by [ID]) as rowindex from product ) tb  where rowinde ...

  10. Python学习笔记之try-except

    Python使用被称为异常的特殊对象来管理程序执行期间发生的错误.每当发生让Python不知所措的错误时,它都会创建一个异常对象.如果你编写了处理该异常的代码,程序将继续运行:如果你未对异常进行处理, ...