【LOJ 2542】【PKUWC2018】 随机游走(最值反演 + 树上期望dp)
哇我太菜啦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)$查询即可。
完结撒花
- #include<bits/stdc++.h>
- #define M 18
- #define MOD 998244353
- #define L long long
- using namespace std;
- L pow_mod(L x,L k){
- L ans=;
- while(k){
- if(k&) ans=ans*x%MOD;
- x=x*x%MOD; k>>=;
- }
- return ans;
- }
- L d[M]={},invd[M]={};
- struct edge{int u,next;}e[M<<]={}; int head[M]={},use=;
- void add(int x,int y){use++;e[use].u=y;e[use].next=head[x];head[x]=use;}
- L f[<<M]={},ans[<<M]={},zf[<<M]={},a[M]={},b[M]={}; int ok[<<M]={};
- int n,q,rt;
- void dfs(int x,int fa,int S){
- if((<<x)&S) return;
- for(int i=head[x];i;i=e[i].next)
- if(e[i].u!=fa){
- dfs(e[i].u,x,S);
- b[x]+=b[e[i].u];
- a[x]+=a[e[i].u];
- }
- b[x]%=MOD; a[x]%=MOD;
- L inv=pow_mod((d[x]-a[x]+MOD)%MOD,MOD-);
- a[x]=inv;
- b[x]=(b[x]*inv+inv*d[x])%MOD;
- }
- void solve(int x){
- ok[x]=;
- for(int i=x;i;i=x&(i-))
- ans[x]+=zf[i]*f[i];
- ans[x]=(ans[x]%MOD+MOD)%MOD;
- }
- int main(){
- //freopen("a.out","w",stdout);
- scanf("%d%d%d",&n,&q,&rt); rt--;
- for(int i=;i<n;i++){
- int x,y; scanf("%d%d",&x,&y);
- x--; y--; add(x,y); add(y,x);
- d[x]++; d[y]++;
- }
- for(int i=;i<n;i++) invd[i]=pow_mod(d[i],MOD-);
- int hh=<<n;
- for(int i=;i<hh;i++){
- memset(a,,sizeof(a));
- memset(b,,sizeof(b));
- dfs(rt,-,i);
- f[i]=b[rt]; zf[i]=-;
- for(int j=;j<n;j++)
- if((<<j)&i) zf[i]=-zf[i];
- }
- while(q--){
- int k,hh=; scanf("%d",&k);
- while(k--){
- int x; scanf("%d",&x);
- hh+=<<(x-);
- }
- if(!ok[hh]) solve(hh);
- printf("%lld\n",ans[hh]);
- }
- }
【LOJ 2542】【PKUWC2018】 随机游走(最值反演 + 树上期望dp)的更多相关文章
- LOJ #2542. 「PKUWC 2018」随机游走(最值反演 + 树上期望dp + FMT)
写在这道题前面 : 网上的一些题解都不讲那个系数是怎么推得真的不良心 TAT (不是每个人都有那么厉害啊 , 我好菜啊) 而且 LOJ 过的代码千篇一律 ... 那个系数根本看不出来是什么啊 TAT ...
- loj 2542 随机游走 —— 最值反演+树上期望DP+fmt
题目:https://loj.ac/problem/2542 因为走到所有点的期望就是所有点期望的最大值,所以先最值反演一下,问题变成从根走到一个点集任意一点就停止的期望值: 设 \( f[x] \) ...
- LOJ #2542 [PKUWC2018]随机游走 (概率期望、组合数学、子集和变换、Min-Max容斥)
很好很有趣很神仙的题! 题目链接: https://loj.ac/problem/2542 题意: 请自行阅读 题解首先我们显然要求的是几个随机变量的最大值的期望(不是期望的最大值),然后这玩意很难求 ...
- [LOJ#2542] [PKUWC2018] 随机游走
题目描述 给定一棵 n 个结点的树,你从点 x 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 Q 次询问,每次询问给定一个集合 S,求如果从 x 出发一直随机游走,直到点集 S 中所有点都 ...
- LOJ2542 随机游走 Min-Max容斥+树上期望DP
搞了一下午 真的是啥都不会 首先这道题要用到Min-Max容斥 得到的结论是 设 $Max(S)$表示集合里最晚被访问的节点被访问的期望步数 设 $Min(S)$表示集合里最早被访问的节点被访问的期望 ...
- 【LOJ#2542】[PKUWC2018]随机游走(min-max容斥,动态规划)
[LOJ#2542][PKUWC2018]随机游走(min-max容斥,动态规划) 题面 LOJ 题解 很明显,要求的东西可以很容易的进行\(min-max\)容斥,那么转为求集合的\(min\). ...
- LOJ2542 PKUWC2018 随机游走 min-max容斥、树上高斯消元、高维前缀和、期望
传送门 那么除了D1T3,PKUWC2018就更完了(斗地主这种全场0分的题怎么会做啊) 发现我们要求的是所有点中到达时间的最大值的期望,\(n\)又很小,考虑min-max容斥 那么我们要求从\(x ...
- 【洛谷5643】[PKUWC2018] 随机游走(Min-Max容斥+待定系数法+高维前缀和)
点此看题面 大致题意: 从一个给定点出发,在一棵树上随机游走,对于相邻的每个点均有\(\frac 1{deg}\)的概率前往.多组询问,每次给出一个点集,求期望经过多少步能够访问过点集内所有点至少一次 ...
- [PKUWC2018] 随机游走
Description 给定一棵 \(n\) 个结点的树,你从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 \(Q\) 次询问,每次询问给定一个集合 \(S\),求如果从 ...
随机推荐
- 换行符在HTML中直接替换为<br>
#set($text=$!obj.getMeasure().replaceAll("\r\n","<br>")) <td a ...
- JSONModel简便应用
JSONModel, Mantle 这两个开源库都是用来进行封装JSON->Model的, 想想看, 直接向服务器发起一个请求,然后回来后,就是一个Model, 直接使用, 这是一个多么美好的事 ...
- 2018.10.21 codeforces1071B. Minimum path(dp+贪心+bfs)
传送门 唉考试的时候写错了两个细节调了一个多小时根本没调出来. 下来又调了半个小时才过. 其实很简单. 我们先dpdpdp出最开始最多多少个连续的aaa. 然后对于没法继续连续下去的用贪心+bfsbf ...
- tred_extract_EDED_new
# -*- coding:utf-8 -*- import re ''' 适应新版本 ''' year='17a'#用户自定义 ss='./data/'#根目录 filename = ss+'EDED ...
- Yarn application has already exited with state FINISHED
如果在运行spark-sql时遇到如下这样的错误,可能是因为yarn-site.xml中的配置项yarn.nodemanager.vmem-pmem-ratio值偏小,它的默认值为2.1,可以尝试改大 ...
- 记spring mvc传入List<Object>的一次尝试
首先,看一段异常: org.springframework.http.converter.HttpMessageNotReadableException: Could not read documen ...
- "请求被中止: 未能创建 SSL/TLS 安全通道"解决办法
1.安装证书: 手动双击证书安装,过程略 2.分配权限: 在控制台中找到安装的证书,右键选择“管理私钥”, 添加自己需要的权限,如果在测试可以直接添加Everyone 3.修改代码:public st ...
- pytest 简介与安装
前面我们已经基本上掌握了unittest测试框架,下面我们将学习新的pytest测试框架.之于原因嘛,太流行啦!掌握一个框架是不够的,急需另外一个,于是瞅上了pytest. pytest是什么? py ...
- Gridview的RowDataBound事件可以做很多事情
protected void gvTest_RowDataBound(object sender, GridViewRowEventArgs e) { //如果是绑 ...
- Oracle sql 优化の索引监控
1.监视索引是否使用 除了主键是完整性约束而自动变为索引外,创建普通索引的目的就是为了提高查询速度,如果我们创建了索引而没有被使用,那么这些不被使用的索引将起到阻碍性能的作用. 语法: --检查某个索 ...