传送门


那么除了D1T3,PKUWC2018就更完了(斗地主这种全场0分的题怎么会做啊)

发现我们要求的是所有点中到达时间的最大值的期望,\(n\)又很小,考虑min-max容斥

那么我们要求从\(x\)走到第一个属于某个子集\(S\)的节点的步数期望,这是一个经典的树上高斯消元问题。

将树设为以\(x\)为根,设\(f_{i , S}\)为从第\(i\)个点随机游走到达点集\(S\)任意一个点停止,行走步数的期望,转移:

\(1.i \in S: f_{i , S}=0\)

\(2.i \not\in S : f_{i , S} = \frac{1}{in_i} \sum\limits_{(i,j) \in e}f_{j,S} + 1\)

直接这么做是\(O(2^nn^3)\)的,但是因为树上的优美性质,高斯消元可以做到\(O(n)\)。

首先对于一个点集\(S\)中的点\(t\),\(t\)的子树是没有必要的,可以截去。

然后对于所有叶子节点\(k\),要么\(f_{k , S} = 0\) ,要么\(f_{k , S} = f_{fa_k , S} + 1\)。可以发现对于当前的某一个点\(x\),如果它的所有子节点\(y\)都是叶子节点,可以通过消元将\(f_{x,S}\)变为\(k \times f_{fa_k , S} + b\)的形式,其中\(k,b\)都是常数。这么按照无根树拓扑序推上去,可以知道除根结点的所有节点\(x\),\(f_{x , S} = k \times f_{fa_x , S} + b\)的形式,而根结点可以推出\(f_{x,S} = b\),就可以求出来从根结点走到第一个属于\(S\)的节点的步数期望了。

乘上\(-1^{|S| + 1}\)之后,题目求的最大值期望实质上就是一个子集和,高维前缀和之后\(O(1)\)回答询问,总复杂度\(O(n2^n + Q)\)。

  1. #include<bits/stdc++.h>
  2. //This code is written by Itst
  3. using namespace std;
  4. inline int read(){
  5. int a = 0;
  6. char c = getchar();
  7. bool f = 0;
  8. while(!isdigit(c) && c != EOF){
  9. if(c == '-')
  10. f = 1;
  11. c = getchar();
  12. }
  13. if(c == EOF)
  14. exit(0);
  15. while(isdigit(c)){
  16. a = a * 10 + c - 48;
  17. c = getchar();
  18. }
  19. return f ? -a : a;
  20. }
  21. const int MOD = 998244353;
  22. struct Edge{
  23. int end , upEd;
  24. }Ed[41];
  25. int head[21] , dp[1 << 18] , du[21] , k[21] , b[21] , cnt1[1 << 18];
  26. int N , Q , R , cntEd;
  27. inline int poww(long long a , int b){
  28. int times = 1;
  29. while(b){
  30. if(b & 1)
  31. times = times * a % MOD;
  32. a = a * a % MOD;
  33. b >>= 1;
  34. }
  35. return times;
  36. }
  37. inline void addEd(int a , int b){
  38. Ed[++cntEd].end = b;
  39. Ed[cntEd].upEd = head[a];
  40. head[a] = cntEd;
  41. ++du[b];
  42. }
  43. void dfs(int x , int p , int S){
  44. if(S & (1 << x)){
  45. k[x] = b[x] = 0;
  46. return;
  47. }
  48. k[x] = 1;
  49. b[x] = 0;
  50. int t = poww(du[x] , MOD - 2);
  51. for(int i = head[x] ; i ; i = Ed[i].upEd)
  52. if(Ed[i].end != p){
  53. dfs(Ed[i].end , x , S);
  54. k[x] = (k[x] - 1ll * k[Ed[i].end] * t % MOD + MOD) % MOD;
  55. b[x] = (b[x] + 1ll * t * b[Ed[i].end]) % MOD;
  56. }
  57. k[x] = poww(k[x] , MOD - 2);
  58. b[x] = 1ll * (b[x] + 1) * k[x] % MOD;
  59. k[x] = 1ll * k[x] * t % MOD;
  60. }
  61. int main(){
  62. #ifndef ONLINE_JUDGE
  63. freopen("in","r",stdin);
  64. freopen("out","w",stdout);
  65. #endif
  66. N = read();
  67. Q = read();
  68. R = read() - 1;
  69. for(int i = 1 ; i < N ; ++i){
  70. int a = read() - 1 , b = read() - 1;
  71. addEd(a , b);
  72. addEd(b , a);
  73. }
  74. for(int i = 1 ; i < 1 << N ; ++i){
  75. dfs(R , -1 , i);
  76. dp[i] = b[R];
  77. }
  78. for(int i = 1 ; i < 1 << N ; ++i){
  79. cnt1[i] = cnt1[i >> 1] + (i & 1);
  80. if(!(cnt1[i] & 1))
  81. dp[i] = dp[i] ? MOD - dp[i] : 0;
  82. }
  83. for(int i = 0 ; i < N ; ++i)
  84. for(int j = 1 ; j < 1 << N ; ++j)
  85. if(!(j & (1 << i)))
  86. (dp[j | (1 << i)] += dp[j]) %= MOD;
  87. for(int i = 1 ; i <= Q ; ++i){
  88. int S = 0;
  89. for(int j = read() ; j ; --j)
  90. S += 1 << (read() - 1);
  91. printf("%d\n" , dp[S]);
  92. }
  93. return 0;
  94. }

LOJ2542 PKUWC2018 随机游走 min-max容斥、树上高斯消元、高维前缀和、期望的更多相关文章

  1. 【LOJ#2542】[PKUWC2018]随机游走(min-max容斥,动态规划)

    [LOJ#2542][PKUWC2018]随机游走(min-max容斥,动态规划) 题面 LOJ 题解 很明显,要求的东西可以很容易的进行\(min-max\)容斥,那么转为求集合的\(min\). ...

  2. loj2542 「PKUWC2018」随机游走 MinMax 容斥+树上高斯消元+状压 DP

    题目传送门 https://loj.ac/problem/2542 题解 肯定一眼 MinMax 容斥吧. 然后问题就转化为,给定一个集合 \(S\),问期望情况下多少步可以走到 \(S\) 中的点. ...

  3. 洛谷 P5643 - [PKUWC2018]随机游走(Min-Max 容斥+FWT+树上高斯消元,hot tea)

    题面传送门 一道挺综合的 hot tea,放到 PKUWC 的 D2T2 还挺喜闻乐见的( 首先我们考虑怎样对一个固定的集合 \(S\) 计算答案,注意到我们要求的是一个形如 \(E(\max(S)) ...

  4. 【LOJ2542】【PKUWC 2018】随机游走 min-max容斥 树上高斯消元

    题目描述 有一棵 \(n\) 个点的树.你从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 \(q\) 次询问,每次询问给定一个集合 \(S\),求如果从 \(x\) 出发一 ...

  5. 【洛谷5643】[PKUWC2018] 随机游走(Min-Max容斥+待定系数法+高维前缀和)

    点此看题面 大致题意: 从一个给定点出发,在一棵树上随机游走,对于相邻的每个点均有\(\frac 1{deg}\)的概率前往.多组询问,每次给出一个点集,求期望经过多少步能够访问过点集内所有点至少一次 ...

  6. 「PKUWC2018」随机游走(min-max容斥+FWT)

    「PKUWC2018」随机游走(min-max容斥+FWT) 以后题目都换成这种「」形式啦,我觉得好看. 做过重返现世的应该看到就想到 \(min-max\) 容斥了吧. 没错,我是先学扩展形式再学特 ...

  7. LOJ2542 PKUWC2018随机游走(概率期望+容斥原理)

    如果直接dp,状态里肯定要带上已走过的点的集合,感觉上不太好做. 考虑一种对期望的minmax容斥:其中Max(S)为遍历完S集合的期望步数,Min(S)为遍历到S集合中一个点的期望步数.当然才不管怎 ...

  8. BZOJ3141 Hnoi2013 游走 【概率DP】【高斯消元】*

    BZOJ3141 Hnoi2013 Description 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点 ...

  9. 【BZOJ3143】【HNOI2013】游走 && 【BZOJ3270】博物馆 【高斯消元+概率期望】

    刚学完 高斯消元,我们来做几道题吧! T1:[BZOJ3143][HNOI2013]游走 Description 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小 ...

随机推荐

  1. Universal-ImageLoader,Picasso,Fresco,Glide对比

    Universal-ImageLoader:(估计由于HttpClient被Google放弃,作者就放弃维护这个框架)优点:1.支持下载进度监听2.可以在 View 滚动中暂停图片加载,通过 Paus ...

  2. AJAX的优点 个人理解记录

    1:对网站性能的提高.例如我只需要刷新页面中购物车的数据,使用ajax时不需要请求整个页面的数据,对于客户端和服务器的压力都会降低, 减少了ISP的负担,服务器的空间和带宽压力都会降低. 2:用户体验 ...

  3. 08-OpenLDAP主机控制策略

    OpenLDAP主机控制策略 阅读视图 参考 环境准备 openldap服务端配置 openldap客户端配置 客户端测试登录 故障处理 1. 参考 本文基本转载博客openldap主机访问控制(基于 ...

  4. CSS图片水平垂直居中

    Html: <div id="></img></div> </div> CSS: #MainContent { display:table-c ...

  5. nginx server_name匹配顺序

    server_name可为IP/domain/localhost/null等任何字符串(字符串server_name也可以用来匹配),注意各个 server 块的顺序. 1.如果只有一个server, ...

  6. fedora 28 重新生成 /boot/grub2/grub.cfg

    使用情景: 之前电脑安装了windows 7/ fedora 28 双系统,由于特殊原因,需要删除 windows 系统.在格式化硬盘后,我们还需要跟新 grub2 的启动条目:删除grub 启动的界 ...

  7. Maven将依赖包、jar/war包及配置文件输出到指定目录

    使用Maven插件将依赖包 jar包 war包及配置文件输出到指定目录 写在前面 ​ 最近遇到一个朋友遇到一个项目需要将 maven 的依赖包和配置文件分开打包然后用脚本执行程序.这样的好处在于可以随 ...

  8. SAP S4/HANA BP屏幕增强添加自定义字段(BDT方式)

    喜欢博主的读者也许会意识到,这是本博客中第一篇有关屏幕增强的文章.之前没有总结过相关的东西,除了因为相关经验有限之外,我个人也是不喜欢所谓dynpro编程的,它有许多“潜规则”一样的东西要记住,想要运 ...

  9. Sublime Text 3安装及常用插件安装

    一.Sublime3下载 1.百度搜索Sublime3 download,选择进入下载页面 2.我选择下载Win64位安装程序 二.Sublime3安装 傻瓜式安装,一直点下一步即可. 三.Subli ...

  10. Python程序的编写方式

    直接在Python的交互式环境编写代码 现在,了解了如何启动和退出Python的交互式环境,我们就可以正式开始编写Python代码了. 在写代码之前,请千万不要用“复制”-“粘贴”把代码从页面粘贴到你 ...