搞了一下午 真的是啥都不会
首先这道题要用到Min-Max容斥 得到的结论是

设 \(Max(S)\)表示集合里最晚被访问的节点被访问的期望步数
设 \(Min(S)\)表示集合里最早被访问的节点被访问的期望步数
那么$ Max(S) = ∑_{T \in S} {-1^ { \lvert T \rvert+1} }Min(T)$
(这个相关的证明和理解可以看看HDU4336 附一个题解)

考虑对于一个集合\(S\)如何计算\(Min(S)\)
记\(d_u\)为点\(u\)的度数
当\(u\notin S \space\space \Rightarrow \space \space\displaystyle f_u=f_{fa[u]}+1+\sum (f_{son[u]}+1)\times \frac{1}{d_u}\)
当\(u \in S\space\space \Rightarrow \space \space f(u)=0\)
对于树上的期望可以写成$f_u=k_u\times f_{fa[u]}+b_u \(的形式 于是\)\sum f_{son[u]}=\sum_{fa[v]=u}(a_v \times f_u+b_v)$
代入之前的式子并化简得
\(\displaystyle (1-\frac{\sum A_v}{d_u}) f(u) = \frac{1}{d_u}f_{\mathrm{fa}[u]}+(1+\frac{B_v}{d_u})\)
这个\(dfs\)一遍就可以维护所有点的\(a,b\)了

考虑如何回答询问
可以对于每个询问的集合\(S\)暴力枚举子集 这样是可以过得
但我们也可以像类似\(FMT\)的做法先维护出所有集合的子集之和再\(O(1)\)回答每个询问 这里注意每个集合初值的正负

#include<bits/stdc++.h>
using namespace std;
#define FO(x) {freopen(#x".in","r",stdin);freopen(#x".out","w",stdout);}
#define pa pair<int,int>
#define mod 998244353
#define ll long long
#define mk make_pair
#define pb push_back
#define lb double
#define fi first
#define se second
#define cl(x) memset(x,0,sizeof x)
#ifdef Devil_Gary
#define bug(x) cout<<(#x)<<" "<<(x)<<endl
#define debug(...) fprintf(stderr, __VA_ARGS__)
#else
#define bug(x)
#define debug(...)
#endif
const int INF = 0x7fffffff;
const int N=1e6+5;
const int M=25;
/*
char *TT,*mo,but[(1<<15)+2];
#define getchar() ((TT==mo&&(mo=(TT=but)+fread(but,1,1<<15,stdin),TT==mo))?-1:*TT++)//*/
inline int read(){int x=0,rev=0,ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')rev=1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return rev?-x:x;
}
struct Edge{int v,nxt;
}e[N<<1];
int n,Q,rt,tot,head[M],bin[N],a[M],b[M],bit[N],d[M],f[N];
void add(int u,int v){e[++tot].v=v,e[tot].nxt=head[u],head[u]=tot,++d[u];e[++tot].v=u,e[tot].nxt=head[v],head[v]=tot,++d[v];
}
int poww(int x,int y){int ans=1;while(y){if(y&1) ans=(ll)ans*x%mod;y>>=1,x=(ll)x*x%mod;}return ans;
}
void dfs(int x,int fa,int S){a[x]=b[x]=0;if((1<<x)&S) return;for(int i=head[x];i;i=e[i].nxt){int j=e[i].v;if(j==fa) continue;dfs(j,x,S);(a[x]+=a[j])%=mod,(b[x]+=b[j])%=mod;}int tmp=poww((1+mod-(ll)a[x]*d[x]%mod)%mod,mod-2);a[x]=(ll)tmp*d[x]%mod,b[x]=(ll)(1+(ll)b[x]*d[x]%mod)*tmp%mod;
//  cout<<x<<" "<<a[x]<<" "<<b[x]<<endl;
}
int main(){
#ifdef Devil_Garyfreopen("in.txt","r",stdin);
#endifn=read(),Q=read(),rt=read()-1;for(int i=1;i<n;i++) add(read()-1,read()-1);for(int i=0;i<n;i++) d[i]=poww(d[i],mod-2);for(int i=1;i<(1<<n);i++) bin[i]=bin[i>>1]+(i&1);for(int i=0;i<(1<<n);i++) dfs(rt,-1,i),f[i]=bin[i]&1?b[rt]:(mod-b[rt])%mod;
//  for(int i=0;i<(1<<n);i++) cout<<i<<" "<<f[i]<<endl;for(int j=0;j<n;j++) for(int i=0;i<(1<<n);i++)  if(i&(1<<j)) (f[i]+=f[i^(1<<j)])%=mod;while(Q--){int S=0;for(int T=read();T;T--) S|=(1<<(read()-1));
//      bug(S);printf("%d\n",f[S]);}
}

转载于:https://www.cnblogs.com/devil-gary/p/9216631.html

LOJ2542 随机游走 Min-Max容斥+树上期望DP相关推荐

  1. P5643-[PKUWC2018]随机游走【min-max容斥,dp】

    正题 题目链接:https://www.luogu.com.cn/problem/P5643 题目大意 给出nnn个点的一棵树,一个人从点xxx开始随机游走,然后QQQ次询问给出一个点集SSS,求期望 ...

  2. 【PKUWC2018】随机游走【Min-Max容斥】【树形dp】【FWT】

    题意:给一棵nnn个点的无权树和xxx,qqq次询问,每次给定一个点集SSS,询问从xxx开始每次随机走一步,SSS中的每个点至少被经过一次的期望步数. n≤18,q≤5000n\leq 18,q\l ...

  3. P3175 [HAOI2015]按位或(Min - Max容斥,FMT,概率期望,全网最清晰的题解!)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Weblink https://www.luogu.com.cn/problem/P3175 Prob ...

  4. 最值反演[PKUWC2018][loj2542]随机游走

    前言 这是学习容斥过程中的一个比较裸的题了 题意简介 题目链接 题目大意 给出一棵nnn个点的树,给出树上的一个点xxx 现在进行QQQ次询问,每次询问一个点集,求从xxx点开始进行随机随机游走,第一 ...

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

    loj#2542 [PKUWC2018]随机游走 (概率期望.组合数学.子集和变换.Min-Max容斥) 很好很有趣很神仙的题! 题目链接: https://loj.ac/problem/2542 题 ...

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

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

  7. 「PKUWC2018」随机游走

    Min-Max容斥真好用 LOJ #2542 题意:给一棵不超过1818个节点的树,50005000次询问,每次问从根随机游走走遍一个集合的期望步数 Solution: 考虑Min-Max容斥 有Ma ...

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

    LOJ#2542. 「PKUWC2018」随机游走 题目描述 Solution 去过一个点集中所有节点的期望时间不好求,考虑min−maxmin-maxmin−max容斥,转化为求第一次到达某一个点集 ...

  9. UA MATH563 概率论的数学基础 鞅论初步10 Doob可选停止定理与一维随机游走的exiting time

    UA MATH563 概率论的数学基础 鞅论初步10 Doob可选停止定理与一维随机游走的exiting time 这一讲介绍可选停时(optional stopping),我们先回顾一下停时的定义: ...

  10. python游走代码_介绍一个全局最优化的方法:随机游走算法(Random Walk)

    1. 关于全局最优化求解 全局最优化是一个非常复杂的问题,目前还没有一个通用的办法可以对任意复杂函数求解全局最优值.上一篇文章讲解了一个求解局部极小值的方法--梯度下降法.这种方法对于求解精度不高的情 ...

最新文章

  1. Mac MySQL 数据库配置(关系型数据库管理系统)
  2. mysql添加定时器
  3. 对付网络盗贼的三板斧
  4. 快速排序的递归和非递归的实现
  5. 趣图:BAT程序员的一天对比
  6. 详述白盒测试的逻辑覆盖法的条件判定覆盖及其优缺点
  7. 手写一个HTTP图片资源服务器,太容易了叭!
  8. python库手册_Python 中文开发手册
  9. [生存志] 第54节 武经七书司马法
  10. UI设计课EDC研究所1期 Part 9 -“特殊的字体”
  11. Windows系统下Android DNK r5环境配置和开发(二)
  12. 判断玩家是否开全图挂
  13. 【推荐】技术面试结束后,如何向技术面试官提问?
  14. pci规划的三个原则_LTE中PCI规划目的和原则
  15. 滤波器:使用Filter solutions设计椭圆函数LC高通滤波器
  16. sqli-labs 1~4 多命通关攻略
  17. linux 开机运行命令
  18. 使用Tensorflow训练LSTM+Attention中文标题党分类
  19. Redis Geospatial地理位置
  20. 使用vue控制video视频和弹幕功能

热门文章

  1. Linux Qt工程组织结构与动态库引用
  2. (转) CCEditBox 编辑框
  3. ARTS打卡第14周
  4. yii2之ActiveRecord 模型
  5. php 学习笔记之搭建开发环境(mac版)
  6. springboot10-springcloud-eureka 服务注册与发现,负载均衡客户端(ribbon,feign)调用
  7. MyBatis和Hibernate的优缺点对比。
  8. 写一条SQL,使它通过全表扫描方式的效率优于索引访问,分别给出各自的执行计划。...
  9. 算法89---图的最小生成树
  10. java 多线程 6 : 同步锁(Lock)