题意

题目链接

Sol

考虑直接对询问的集合做MinMax容斥

设\(f[i][sta]\)表示从\(i\)到集合\(sta\)中任意一点的最小期望步数

按照树上高斯消元的套路,我们可以把转移写成\(f[x] = a_x f[fa] + b_x\)的形式

然后直接推就可以了

更详细的题解

  1. #include<bits/stdc++.h>
  2. #define LL long long
  3. using namespace std;
  4. const int MAXN = 1e6 + 10, mod = 998244353;
  5. inline int read() {
  6. char c = getchar(); int x = 0, f = 1;
  7. while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
  8. while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
  9. return x * f;
  10. }
  11. int mul(int x, int y) {return 1ll * x * y % mod;}
  12. int add(int x, int y) {if(x + y < 0) return x + y + mod; else return x + y >= mod ? x + y - mod : x + y;}
  13. int fp(int a, int p) {
  14. int base = 1;
  15. for(; p; p >>= 1, a = mul(a, a))
  16. if(p & 1) base = mul(base, a);
  17. return base;
  18. }
  19. int inv(int x) {
  20. x = (x + mod) % mod;
  21. return fp(x, mod - 2);
  22. }
  23. int N, Q, S, Lim, g[MAXN], deg[MAXN], a[MAXN], b[MAXN], siz[MAXN];
  24. vector<int> v[MAXN];
  25. void dfs(int x, int fa, int sta) {
  26. if(sta & (1 << x - 1)) {a[x] = b[x] = 0; return ;}
  27. int ta = 0, tb = 0;
  28. for(int i = 0; i < v[x].size(); i++) {
  29. int to = v[x][i]; if(to == fa) continue;
  30. dfs(to, x, sta);
  31. ta += a[to]; tb += b[to];
  32. }
  33. a[x] = inv(deg[x] - ta);
  34. b[x] = mul((tb + deg[x]), inv(deg[x] - ta));
  35. }
  36. int main() {
  37. N = read(); Q = read(); S = read(); Lim = (1 << N) - 1;
  38. for(int i = 1; i <= N - 1; i++) {
  39. int x = read(), y = read();
  40. v[x].push_back(y); v[y].push_back(x);
  41. deg[x]++; deg[y]++;
  42. }
  43. for(int sta = 1; sta <= Lim; sta++) {
  44. siz[sta] = siz[sta >> 1] + (sta & 1);
  45. dfs(S, 0, sta);
  46. g[sta] = b[S];
  47. }
  48. while(Q--) {
  49. int k = read(), S = 0, ans = 0;
  50. for(int i = 1; i <= k; i++) S |= (1 << (read() - 1));
  51. for(int i = S; i; i = (i - 1) & S) {
  52. if(siz[i] & 1) ans = add(ans, g[i]);
  53. else ans = add(ans, -g[i]);
  54. }
  55. printf("%d\n", ans);
  56. }
  57. return 0;
  58. }

loj#2542. 「PKUWC2018」随机游走(MinMax容斥 期望dp)的更多相关文章

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

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

  2. Loj #2542. 「PKUWC2018」随机游走

    Loj #2542. 「PKUWC2018」随机游走 题目描述 给定一棵 \(n\) 个结点的树,你从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 \(Q\) 次询问,每次 ...

  3. LOJ #2542「PKUWC2018」随机游走

    $ Min$-$Max$容斥真好用 $ PKUWC$滚粗后这题一直在$ todolist$里 今天才补掉..还要更加努力啊.. LOJ #2542 题意:给一棵不超过$ 18$个节点的树,$ 5000 ...

  4. loj#2542. 「PKUWC2018」随机游走(树形dp+Min-Max容斥)

    传送门 首先,关于\(Min-Max\)容斥 设\(S\)为一个点的集合,每个点的权值为走到这个点的期望时间,则\(Max(S)\)即为走遍这个集合所有点的期望时间,\(Min(S)\)即为第一次走到 ...

  5. LOJ 2542 「PKUWC2018」随机游走 ——树上高斯消元(期望DP)+最值反演+fmt

    题目:https://loj.ac/problem/2542 可以最值反演.注意 min 不是独立地算从根走到每个点的最小值,在点集里取 min ,而是整体来看,“从根开始走到点集中的任意一个点就停下 ...

  6. 【LOJ】#2542. 「PKUWC2018」随机游走

    题解 虽然我知道minmax容斥,但是--神仙能想到把这个dp转化成一个一次函数啊= = 我们相当于求给定的\(S\)集合里最后一个被访问到的点的时间,对于这样的max的问题,我们可以用容斥把它转化成 ...

  7. [LOJ2542][PKUWC2018]随机游走(MinMax容斥+树形DP)

    MinMax容斥将问题转化为求x到S中任意点的最小时间. 树形DP,直接求概率比较困难,考虑只求系数.最后由于x节点作为树根无父亲,所以求出的第二个系数就是答案. https://blog.csdn. ...

  8. LOJ2542. 「PKUWC2018」随机游走

    LOJ2542. 「PKUWC2018」随机游走 https://loj.ac/problem/2542 分析: 为了学习最值反演而做的这道题~ \(max{S}=\sum\limits_{T\sub ...

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

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

随机推荐

  1. RF射频技术的原理

    [摘要]射频技术(RF)是Radio Frequency的缩写.较常见的应用有无线射频识别(Radio Frequency Identification,RFID),常称为感应式电子晶片或近接卡.感应 ...

  2. Xshell连接不上虚拟机Linux系统

    以下是我在尝试网上各种办法之后总结的最优解决办法: 1.先在主机上检查虚拟机相关的必要的服务是否都已经启动 2.检查虚拟机系统防火墙是否处于关闭状态 3.检查虚拟机系统的ssh服务是否已经启动 4.检 ...

  3. 【hdu6035】 Colorful Tree dfs序

    题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6035 题目大意:给你一棵树,树上每个节点都有一个颜色. 现在定义两点间的距离为两点最短路径上颜色集合 ...

  4. LeetCode题解-23 合并K个排序链表 Hard

    合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [ 1->4->5, 1->3->4, 2->6 ] 输出: 1->1-&g ...

  5. Java之IO(七)ObjectInputStream和ObjectOutputStream

    转载请注明源出处:http://www.cnblogs.com/lighten/p/7003536.html 1.前言 本章介绍Java字节流中重要的成员,对象流ObjectInputStream和O ...

  6. java8新特性-入门摘要

    本文是针对java8做的入门摘要笔录,详细分析可参见如下原文. 原文地址 http://www.javacodegeeks.com/2013/02/java-8-from-permgen-to-met ...

  7. PHP SNOOPY采集类 总结

    1.基础教程 Snoopy的一些特点: 1抓取网页的内容 fetch 2 抓取网页的文本内容 (去除HTML标签) fetchtext 3抓取网页的链接,表单 fetchlinks fetchform ...

  8. Img与background的区别

    今天做项目中,用background显示了二维码和一些文字,但显示到页面上时,二维码和图片都变得模糊了.于是将图片调整.放大,但在放大后,作为背景图片的它则显示不全,无奈之下用了backgroung- ...

  9. Android 开发工具类 11_ToolFor9Ge

    1.缩放/ 裁剪图片: 2.判断有无网络链接: 3.从路径获取文件名: 4.通过路径生成 Base64 文件: 5.通过文件路径获取到 bitmap: 6.把 bitmap 转换成 base64: 7 ...

  10. Flow中的Switch分析

    A switch statement can complete normally iff at least one of the following is true: (1)The switch bl ...