哇我太菜啦555555

不妨钦定我们需要访问的点集为$S$,在$S$已知的情况下,我们令$f(x) $表示从$x$走到点集$S$中任意一点的期望步数。

若$x∈S$,则显然$f(x)=0$,否则$f[x]=\frac{1}{d[x]}\sum f[ch[x]]+1$。其中$d[x]$表示与$x$相连的节点个数,$ch[x]$为与$x$相连的节点。

然后就列出了$n$条式子,显然是一个$n$元一次方程,可以考虑用高斯消元去求解,这样时间复杂度是$O(n^32^{n})$,只能拿$60$分(然而我考场上是零分啊呜呜呜)

我们考虑用些快速点的方法,考虑将$f[x]$化为$A_xf[fa[x]]+B_x$。其中$fa[x]$表示$x$的父亲。则

$f[x]=A_x[fa[x]]+B_x=\frac{1}{d[x]}\sum f[ch[x]]$

$f[x]=\frac{1}{d[x]}f[fa[x]]+\frac{1}{d[x]}(A_{ch[x]}f[x]+B_{ch[x]})+1$。

经过化简后,得

$f[x]= \dfrac{f[fa[x]]+\sum B_{ch[x]}+1}{d[u]-\sum A_{ch[x]}}$

我们令$g[S]$表示从给定起点$X$出发,走到集合$S$中任意一个点的期望步数。

那么显然,$g[S]=f[X]$。求出所有状态的期望的时间复杂度显然为$O(n 2^n)$。

我们令$G[S]$表示从给定起点$X$出发,将集合$S$中每个点至少走一次的期望步数。

根据$min-max$容斥的相关内容,有

$G[S]=\sum_{i∈S}g[i]\times (-1)^{|i|+1}$

然后我们可以花$O(3^n)$枚举子集,预处理出所有答案。

查询的时候$O(1)$查询即可。

完结撒花

  1. #include<bits/stdc++.h>
  2. #define M 18
  3. #define MOD 998244353
  4. #define L long long
  5. using namespace std;
  6.  
  7. L pow_mod(L x,L k){
  8. L ans=;
  9. while(k){
  10. if(k&) ans=ans*x%MOD;
  11. x=x*x%MOD; k>>=;
  12. }
  13. return ans;
  14. }
  15.  
  16. L d[M]={},invd[M]={};
  17. struct edge{int u,next;}e[M<<]={}; int head[M]={},use=;
  18. void add(int x,int y){use++;e[use].u=y;e[use].next=head[x];head[x]=use;}
  19.  
  20. L f[<<M]={},ans[<<M]={},zf[<<M]={},a[M]={},b[M]={}; int ok[<<M]={};
  21.  
  22. int n,q,rt;
  23. void dfs(int x,int fa,int S){
  24. if((<<x)&S) return;
  25. for(int i=head[x];i;i=e[i].next)
  26. if(e[i].u!=fa){
  27. dfs(e[i].u,x,S);
  28. b[x]+=b[e[i].u];
  29. a[x]+=a[e[i].u];
  30. }
  31. b[x]%=MOD; a[x]%=MOD;
  32. L inv=pow_mod((d[x]-a[x]+MOD)%MOD,MOD-);
  33. a[x]=inv;
  34. b[x]=(b[x]*inv+inv*d[x])%MOD;
  35. }
  36.  
  37. void solve(int x){
  38. ok[x]=;
  39. for(int i=x;i;i=x&(i-))
  40. ans[x]+=zf[i]*f[i];
  41. ans[x]=(ans[x]%MOD+MOD)%MOD;
  42. }
  43.  
  44. int main(){
  45. //freopen("a.out","w",stdout);
  46. scanf("%d%d%d",&n,&q,&rt); rt--;
  47. for(int i=;i<n;i++){
  48. int x,y; scanf("%d%d",&x,&y);
  49. x--; y--; add(x,y); add(y,x);
  50. d[x]++; d[y]++;
  51. }
  52. for(int i=;i<n;i++) invd[i]=pow_mod(d[i],MOD-);
  53. int hh=<<n;
  54. for(int i=;i<hh;i++){
  55. memset(a,,sizeof(a));
  56. memset(b,,sizeof(b));
  57. dfs(rt,-,i);
  58. f[i]=b[rt]; zf[i]=-;
  59. for(int j=;j<n;j++)
  60. if((<<j)&i) zf[i]=-zf[i];
  61. }
  62. while(q--){
  63. int k,hh=; scanf("%d",&k);
  64. while(k--){
  65. int x; scanf("%d",&x);
  66. hh+=<<(x-);
  67. }
  68. if(!ok[hh]) solve(hh);
  69. printf("%lld\n",ans[hh]);
  70. }
  71. }

【LOJ 2542】【PKUWC2018】 随机游走(最值反演 + 树上期望dp)的更多相关文章

  1. LOJ #2542. 「PKUWC 2018」随机游走(最值反演 + 树上期望dp + FMT)

    写在这道题前面 : 网上的一些题解都不讲那个系数是怎么推得真的不良心 TAT (不是每个人都有那么厉害啊 , 我好菜啊) 而且 LOJ 过的代码千篇一律 ... 那个系数根本看不出来是什么啊 TAT ...

  2. loj 2542 随机游走 —— 最值反演+树上期望DP+fmt

    题目:https://loj.ac/problem/2542 因为走到所有点的期望就是所有点期望的最大值,所以先最值反演一下,问题变成从根走到一个点集任意一点就停止的期望值: 设 \( f[x] \) ...

  3. LOJ #2542 [PKUWC2018]随机游走 (概率期望、组合数学、子集和变换、Min-Max容斥)

    很好很有趣很神仙的题! 题目链接: https://loj.ac/problem/2542 题意: 请自行阅读 题解首先我们显然要求的是几个随机变量的最大值的期望(不是期望的最大值),然后这玩意很难求 ...

  4. [LOJ#2542] [PKUWC2018] 随机游走

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

  5. LOJ2542 随机游走 Min-Max容斥+树上期望DP

    搞了一下午 真的是啥都不会 首先这道题要用到Min-Max容斥 得到的结论是 设 $Max(S)$表示集合里最晚被访问的节点被访问的期望步数 设 $Min(S)$表示集合里最早被访问的节点被访问的期望 ...

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

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

  7. LOJ2542 PKUWC2018 随机游走 min-max容斥、树上高斯消元、高维前缀和、期望

    传送门 那么除了D1T3,PKUWC2018就更完了(斗地主这种全场0分的题怎么会做啊) 发现我们要求的是所有点中到达时间的最大值的期望,\(n\)又很小,考虑min-max容斥 那么我们要求从\(x ...

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

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

  9. [PKUWC2018] 随机游走

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

随机推荐

  1. 换行符在HTML中直接替换为<br>

         #set($text=$!obj.getMeasure().replaceAll("\r\n","<br>"))     <td a ...

  2. JSONModel简便应用

    JSONModel, Mantle 这两个开源库都是用来进行封装JSON->Model的, 想想看, 直接向服务器发起一个请求,然后回来后,就是一个Model, 直接使用, 这是一个多么美好的事 ...

  3. 2018.10.21 codeforces1071B. Minimum path(dp+贪心+bfs)

    传送门 唉考试的时候写错了两个细节调了一个多小时根本没调出来. 下来又调了半个小时才过. 其实很简单. 我们先dpdpdp出最开始最多多少个连续的aaa. 然后对于没法继续连续下去的用贪心+bfsbf ...

  4. tred_extract_EDED_new

    # -*- coding:utf-8 -*- import re ''' 适应新版本 ''' year='17a'#用户自定义 ss='./data/'#根目录 filename = ss+'EDED ...

  5. Yarn application has already exited with state FINISHED

    如果在运行spark-sql时遇到如下这样的错误,可能是因为yarn-site.xml中的配置项yarn.nodemanager.vmem-pmem-ratio值偏小,它的默认值为2.1,可以尝试改大 ...

  6. 记spring mvc传入List<Object>的一次尝试

    首先,看一段异常: org.springframework.http.converter.HttpMessageNotReadableException: Could not read documen ...

  7. "请求被中止: 未能创建 SSL/TLS 安全通道"解决办法

    1.安装证书: 手动双击证书安装,过程略 2.分配权限: 在控制台中找到安装的证书,右键选择“管理私钥”, 添加自己需要的权限,如果在测试可以直接添加Everyone 3.修改代码:public st ...

  8. pytest 简介与安装

    前面我们已经基本上掌握了unittest测试框架,下面我们将学习新的pytest测试框架.之于原因嘛,太流行啦!掌握一个框架是不够的,急需另外一个,于是瞅上了pytest. pytest是什么? py ...

  9. Gridview的RowDataBound事件可以做很多事情

    protected void gvTest_RowDataBound(object sender, GridViewRowEventArgs e)        {            //如果是绑 ...

  10. Oracle sql 优化の索引监控

    1.监视索引是否使用 除了主键是完整性约束而自动变为索引外,创建普通索引的目的就是为了提高查询速度,如果我们创建了索引而没有被使用,那么这些不被使用的索引将起到阻碍性能的作用. 语法: --检查某个索 ...