【洛谷5643】[PKUWC2018] 随机游走(Min-Max容斥+待定系数法+高维前缀和)
大致题意: 从一个给定点出发,在一棵树上随机游走,对于相邻的每个点均有\(\frac 1{deg}\)的概率前往。多组询问,每次给出一个点集,求期望经过多少步能够访问过点集内所有点至少一次。
\(Min-Max\)容斥
访问过每个点至少一次,显然不是什么好处理的东西。
我们考虑一个叫\(Min-Max\)容斥的东西。
关于\(Min-Max\)容斥,有这样一个公式:
\]
套到这题,\(E(max(S))\)就是访问点集\(S\)所有点至少一次的期望步数,\(E(min(T))\)就是到达点集\(T\)一个点的期望步数。
经过这样的转化,似乎就可做了许多。
待定系数法
设\(f_i\)为从\(i\)出发,到达点集\(T\)一个点的期望步数。
对于一个不属于点集\(T\)的\(i\),设其度数为\(deg_i\),因为它对于相邻的每个点均有\(\frac 1{deg_i}\)的概率前往,显然有:
\]
其中\(j\)满足\(j\)是\(i\)的子节点。
乍一看,\(f_i\)既会从子节点转移,又会从父节点转移,转移出现了环,似乎需要高斯消元。
但实际上,对于这道题,我们可以使用待定系数法。
设\(f_i=k_if_{fa_i}+b_i\),根据上面的转移方程,我们知道:
\]
两边同乘\(deg_i\),便可得:
\]
移项,得到:
\]
两边同除以\(deg_i-\sum k_j\),可得:
\]
即:
\]
仔细观察,可以发现,这两个式子均与父节点无关,只和子节点有关系。
上述讨论都是对于不属于点集\(T\)中的\(i\)的,而对于点集\(T\)中的\(i\),由于\(f_i=0\),所以\(k_i=b_i=0\)。
所以,我们只要通过一遍\(dfs\),就可以求出所有点的\(k_i\)和\(b_i\)了。
如果我们把题目中给定的出发点作为根节点,由于其不存在父节点,所以\(f_{rt}=b_{rt}\)。
而\(f_{rt}\)也正是我们所要求的到达点集\(T\)一个点的期望步数。
高维前缀和
现在我们已经知道了,对于一个点集\(T\),如何求出到达点集\(T\)一个点的期望步数。
那么,对于给出的一个询问,我们就可以套用之前的公式:
\]
但是,由于询问数量较多,如果对于每一次询问都去枚举子集计算答案,就会\(TLE\)。
怎么办呢?
注意到对于任意一个点集\(T\),\((-1)^{|T|+1}E(min(T))\)完全与\(S\)没有半点关系。
因此,我们可以先暴力枚举\(T\),求出每一个\(T\)的答案,然后用高维前缀和来预处理\(S\)的答案。
关于高维前缀和,如果你不太了解,可以看看我的这一篇博客:浅谈高维前缀和。
这样一来,对于每次询问,我们就可以直接输出答案了。
代码
#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
#define N 18
#define X 998244353
#define add(x,y) (e[++ee].nxt=lnk[x],e[lnk[x]=ee].to=y)
#define Inc(x,y) ((x+=(y))>=X&&(x-=X))
using namespace std;
int n,rt,ee,lnk[N+5];struct edge {int to,nxt;}e[2*N+5];
I int Qpow(RI x,RI y) {RI t=1;W(y) y&1&&(t=1LL*t*x%X),x=1LL*x*x%X,y>>=1;return t;}
namespace DP//树形DP预处理答案
{
int p[N+5],k[N+5],b[N+5],s[1<<N],g[1<<N];
I void dfs(CI x,CI lst)//DP
{
if(p[x]) return (void)(k[x]=b[x]=0);//如果在点集T中,直接返回
RI i,d=0,sk=0,sb=0;for(i=lnk[x];i;i=e[i].nxt) ++d,//枚举子节点的同时统计度数
e[i].to^lst&&(dfs(e[i].to,x),Inc(sk,k[e[i].to]),Inc(sb,b[e[i].to]));//枚举子节点,并统计k与b的和
k[x]=Qpow((d-sk+X)%X,X-2),b[x]=1LL*(d+sb)*Qpow((d-sk+X)%X,X-2)%X;//计算当前节点k与b的值
}
I void Init()
{
RI i,j,t=1<<n;for(i=1;i^t;++i)//枚举点集T
{for(j=1;j<=n;++j) p[j]=(i>>j-1)&1;dfs(rt,0),s[i]=b[rt];}//求出到达点集T一个点的期望步数
}
I void Calc()
{
RI i,j,t=1<<n;for(i=1;i^t;++i) !(g[i]=g[i>>1]^(i&1))&&(s[i]=X-s[i]);//乘上容斥系数
for(j=1;j<=n;++j) for(i=1;i^t;++i) (i>>j-1)&1&&Inc(s[i],s[i-(1<<j-1)]);//高维前缀和
}
}
int main()
{
RI Qt,i,x,y,t;scanf("%d%d%d",&n,&Qt,&rt);
for(i=1;i^n;++i) scanf("%d%d",&x,&y),add(x,y),add(y,x);DP::Init(),DP::Calc();//读入+预处理
W(Qt--)//处理询问
{
for(scanf("%d",&x),t=0,i=1;i<=x;++i) scanf("%d",&y),t|=1<<y-1;//读入,状压
printf("%d\n",DP::s[t]);//直接输出答案
}return 0;
}
【洛谷5643】[PKUWC2018] 随机游走(Min-Max容斥+待定系数法+高维前缀和)的更多相关文章
- 洛谷 P5643 - [PKUWC2018]随机游走(Min-Max 容斥+FWT+树上高斯消元,hot tea)
题面传送门 一道挺综合的 hot tea,放到 PKUWC 的 D2T2 还挺喜闻乐见的( 首先我们考虑怎样对一个固定的集合 \(S\) 计算答案,注意到我们要求的是一个形如 \(E(\max(S)) ...
- 【LOJ#2542】[PKUWC2018]随机游走(min-max容斥,动态规划)
[LOJ#2542][PKUWC2018]随机游走(min-max容斥,动态规划) 题面 LOJ 题解 很明显,要求的东西可以很容易的进行\(min-max\)容斥,那么转为求集合的\(min\). ...
- 「PKUWC2018」随机游走(min-max容斥+FWT)
「PKUWC2018」随机游走(min-max容斥+FWT) 以后题目都换成这种「」形式啦,我觉得好看. 做过重返现世的应该看到就想到 \(min-max\) 容斥了吧. 没错,我是先学扩展形式再学特 ...
- [PKUWC2018] 随机游走
Description 给定一棵 \(n\) 个结点的树,你从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 \(Q\) 次询问,每次询问给定一个集合 \(S\),求如果从 ...
- LOJ2542 PKUWC2018 随机游走 min-max容斥、树上高斯消元、高维前缀和、期望
传送门 那么除了D1T3,PKUWC2018就更完了(斗地主这种全场0分的题怎么会做啊) 发现我们要求的是所有点中到达时间的最大值的期望,\(n\)又很小,考虑min-max容斥 那么我们要求从\(x ...
- [LOJ#2542] [PKUWC2018] 随机游走
题目描述 给定一棵 n 个结点的树,你从点 x 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 Q 次询问,每次询问给定一个集合 S,求如果从 x 出发一直随机游走,直到点集 S 中所有点都 ...
- LOJ #2542 [PKUWC2018]随机游走 (概率期望、组合数学、子集和变换、Min-Max容斥)
很好很有趣很神仙的题! 题目链接: https://loj.ac/problem/2542 题意: 请自行阅读 题解首先我们显然要求的是几个随机变量的最大值的期望(不是期望的最大值),然后这玩意很难求 ...
- 【洛谷3232】[HNOI2013] 游走(贪心+高斯消元)
点此看题面 大致题意: 一个无向连通图,小\(Z\)从\(1\)号顶点出发,每次随机选择某条边走到下一个顶点,并将\(ans\)加上这条边的编号,走到\(N\)号顶点时结束.请你对边进行编号,使总分期 ...
- 题解-PKUWC2018 随机游走
Problem loj2542 题意:一棵 \(n\) 个结点的树,从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去,询问走完一个集合 \(S\)的期望时间,多组询问 \(n\le ...
随机推荐
- 基于python的种子搜索网站(三)项目部署
项目部署过程 系统要求:ubuntu 16.04(或以上) 环境搭建和配置,必须严格按照以下步骤来安装部署!如有问题可以咨询(weixin:java2048) 安装部分 安装nginx sudo ap ...
- Day 06 流程控制和爬虫基础2
目录 if 判断 单分支结构 双分支结构 多分支结构 for循环 for循环的基本用法 for循环嵌套 break continue 爬虫基础2 爬取豆瓣TOP250 爬取豆瓣数据接口(异步数据) 爬 ...
- postman高级应用
目录 提取接口返回值 设置动态参数 流程控制 调试 定义公共函数 外部数据文件 提取接口返回值 1.获取响应的header值 var Content-Type=postman.getResponseH ...
- 业级PPTP服务器搭建企
搭建企业级PPTP服务器 分类: Linux服务篇 undefined 本文收录在企业项目实战系列 一.VPN 介绍 1.介绍 虚拟私人网络(英语:Virtual Private Network, ...
- exports、module.exports 和 export、export default
先了解他们的使用范围. require: node 和 es6 都支持的引入export / import : 只有es6 支持的导出引入module.exports / exports: 只有 no ...
- hdu 1054 Strategic Game (简单树形DP)
Strategic Game Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- 《Java基础知识》Java类与类之间的关系
类与类之间最常见的关系主要有三种:依赖(uses-a).聚合(has-a)和继承(is-a). 下面以在线书店订单系统为例,来详细的讲述这三种关系的概念. 在线书店订单系统的主要功能是:注册用户可以登 ...
- 浅析 Java 与 C++ 的垃圾回收机制
Java老师在期末复习大纲上出了一道关于JVM垃圾回收机制的题目,想要我们简述一下JVM垃圾回收机制,与老师交流后,大概老师是希望通过与其他语言在垃圾回收对比,介绍一下Java在这方面的特点和 ...
- CDN原理加速解析
CDN概念 CDN全称叫做“Content Delivery Network”,中文叫内容分发网络. 原理分析 我们知道,当我们使用域名访问某一个网站时,实际上就是将请求包(以Http请求为例)通 ...
- 搭建Android开发环境 以及 ionic 编译安卓app步骤
1. 下载安装JDK 下载地址: https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.htm ...