洛谷 P5643 - [PKUWC2018]随机游走(Min-Max 容斥+FWT+树上高斯消元,hot tea)
一道挺综合的 hot tea,放到 PKUWC 的 D2T2 还挺喜闻乐见的(
首先我们考虑怎样对一个固定的集合 \(S\) 计算答案,注意到我们要求的是一个形如 \(E(\max(S))\) 的式子,套用 Min-Max 反演可将其转化为 \(\sum\limits_{T\subseteq S}(-1)^{|T|-1}E(\min(T))\),我们记 \(g_T=(-1)^{|T|-1}E(\min(T))\),那么 \(ans_S=\sum\limits_{T\subseteq S}g^T\),这东西显然是一个高维前缀和的形式,可以通过一遍 FWTor 求出(当然你叫它 SOS dp 我也没意见(
接下来考虑怎样计算 \(g_T\),也就等价于对所有集合 \(T\) 求出从 \(x\) 开始期望随机游走多少次就会走到 \(T\) 中的点。一个很显然的想法是写出一个 \(dp\) 式子然后暴力高斯消元,设 \(dp_{S,i}\) 表示从 \(i\) 开始走到 \(S\) 中的点的期望步数,显然若 \(i\in S,dp_{S,i}=0\),否则 \(dp_{S,i}=1+\dfrac{1}{deg_i}(\sum\limits_{(i,u)\in E}dp_{S,u})\),时间复杂度 \(2^nn^3\approx 10^9\),一脸过不去。考虑优化,注意到这题的图是一棵树,也就是说我们可以利用树的特殊性质进行 树形 \(dp\) instead of 高斯消元,如果没见过这个套路的可以去康康这个题或者这个题。具体来说我们还是设 \(dp_{S,i}\) 表示从 \(i\) 开始走到 \(S\) 中的点的期望步数,然后以 \(x\) 为根开始一遍 DFS,记 \(f\) 为 \(S\) 的父亲,那么 \(dp_{S,u}=1+\dfrac{1}{deg_u}(dp_{S,f}+\sum\limits_{v\in son_u}dp_{S,v})\),不难发现 \(dp_{S,u}\) 可以表示为 \(dp_{S,f}\) 的若干倍加上一个与 \(dp_{S,v}\) 有关的式子,其中 \(v\) 为 \(u\) 的子节点,我们不妨设 \(dp_{S,u}=K_udp_{S,f}+B_u\),那么有 \(dp_{S,u}=1+\dfrac{1}{deg_u}(dp_{S,f}+\sum\limits_{v\in son_u}(K_vdp_{S,u}+B_v))\),等式左右两边同乘 \(deg_u\) 可得 \(deg_udp_{S,u}=deg_u+dp_{S,f}+\sum\limits_{v\in son_u}(K_vdp_{S,u}+B_v)\),再把里面 \(\sum\) 拆开,里面与 \(dp_{S,u}\) 有关的项弄到左边可得 \((deg_u-\sum\limits_{v\in son_u}K_v)dp_{S,u}=dp_{S,f}+deg_u+\sum\limits_{v\in son_u}B_v\),再将左边除过去可得 \(dp_{S,u}=\dfrac{1}{deg_u-\sum\limits_{v\in son_u}K_v}dp_{S,f}+\dfrac{deg_u+\sum\limits_{v\in son_u}B_v}{deg_u-\sum\limits_{v\in son_u}K_v}\),故 \(K_u=\dfrac{1}{deg_u-\sum\limits_{v\in son_u}K_v}\),\(B_u=\dfrac{deg_u+\sum\limits_{v\in son_u}B_v}{deg_u-\sum\limits_{v\in son_u}K_v}\),DFS 求解即可,时间复杂度 \(2^nn\)。据说这玩意儿有个名字叫树上高斯消元,orzorz。
const int MAXN=18;
const int MAXP=1<<18;
const int MOD=998244353;
int n,qu,r,hd[MAXN+2],to[MAXN*2+5],nxt[MAXN*2+5],ec=0;
void adde(int u,int v){to[++ec]=v;nxt[ec]=hd[u];hd[u]=ec;}
int qpow(int x,int e=MOD-2){
int ret=1;
for(;e;e>>=1,x=1ll*x*x%MOD) if(e&1) ret=1ll*ret*x%MOD;
return ret;
}
int a[MAXN+2],b[MAXN+2],deg[MAXN+2];
void dfs(int x,int f,int S){
if(S>>(x-1)&1) return;int suma=0,sumb=0;
for(int e=hd[x];e;e=nxt[e]){
int y=to[e];if(y==f) continue;
dfs(y,x,S);suma=(suma+a[y])%MOD;sumb=(sumb+b[y])%MOD;
} int inv=qpow((deg[x]-suma+MOD)%MOD);
a[x]=inv;b[x]=1ll*inv*(sumb+deg[x])%MOD;
}
int ret[MAXP+5];
void FWTor(int *a,int len){
for(int i=2;i<=len;i<<=1)
for(int j=0;j<len;j+=i)
for(int k=0;k<(i>>1);k++)
a[(i>>1)+j+k]=(a[(i>>1)+j+k]+a[j+k])%MOD;
}
int main(){
scanf("%d%d%d",&n,&qu,&r);
for(int i=1,u,v;i<n;i++){
scanf("%d%d",&u,&v);deg[u]++;deg[v]++;
adde(u,v);adde(v,u);
}
for(int i=0;i<(1<<n);i++){
memset(a,0,sizeof(a));memset(b,0,sizeof(b));
dfs(r,0,i);int cnt=__builtin_popcount(i);
ret[i]=((cnt&1)?b[r]:(MOD-b[r])%MOD);
} FWTor(ret,1<<n);
while(qu--){
int k,msk=0;scanf("%d",&k);
for(int i=1,x;i<=k;i++) scanf("%d",&x),msk|=(1<<x-1);
printf("%d\n",ret[msk]);
}
return 0;
}
洛谷 P5643 - [PKUWC2018]随机游走(Min-Max 容斥+FWT+树上高斯消元,hot tea)的更多相关文章
- 【LOJ#2542】[PKUWC2018]随机游走(min-max容斥,动态规划)
[LOJ#2542][PKUWC2018]随机游走(min-max容斥,动态规划) 题面 LOJ 题解 很明显,要求的东西可以很容易的进行\(min-max\)容斥,那么转为求集合的\(min\). ...
- 「PKUWC2018」随机游走(min-max容斥+FWT)
「PKUWC2018」随机游走(min-max容斥+FWT) 以后题目都换成这种「」形式啦,我觉得好看. 做过重返现世的应该看到就想到 \(min-max\) 容斥了吧. 没错,我是先学扩展形式再学特 ...
- LOJ2542 PKUWC2018 随机游走 min-max容斥、树上高斯消元、高维前缀和、期望
传送门 那么除了D1T3,PKUWC2018就更完了(斗地主这种全场0分的题怎么会做啊) 发现我们要求的是所有点中到达时间的最大值的期望,\(n\)又很小,考虑min-max容斥 那么我们要求从\(x ...
- 【洛谷5643】[PKUWC2018] 随机游走(Min-Max容斥+待定系数法+高维前缀和)
点此看题面 大致题意: 从一个给定点出发,在一棵树上随机游走,对于相邻的每个点均有\(\frac 1{deg}\)的概率前往.多组询问,每次给出一个点集,求期望经过多少步能够访问过点集内所有点至少一次 ...
- LOJ 2542 「PKUWC2018」随机游走 ——树上高斯消元(期望DP)+最值反演+fmt
题目:https://loj.ac/problem/2542 可以最值反演.注意 min 不是独立地算从根走到每个点的最小值,在点集里取 min ,而是整体来看,“从根开始走到点集中的任意一个点就停下 ...
- loj2542 「PKUWC2018」随机游走 MinMax 容斥+树上高斯消元+状压 DP
题目传送门 https://loj.ac/problem/2542 题解 肯定一眼 MinMax 容斥吧. 然后问题就转化为,给定一个集合 \(S\),问期望情况下多少步可以走到 \(S\) 中的点. ...
- [PKUWC2018] 随机游走
Description 给定一棵 \(n\) 个结点的树,你从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 \(Q\) 次询问,每次询问给定一个集合 \(S\),求如果从 ...
- [LOJ#2542] [PKUWC2018] 随机游走
题目描述 给定一棵 n 个结点的树,你从点 x 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 Q 次询问,每次询问给定一个集合 S,求如果从 x 出发一直随机游走,直到点集 S 中所有点都 ...
- 【洛谷3232】[HNOI2013] 游走(贪心+高斯消元)
点此看题面 大致题意: 一个无向连通图,小\(Z\)从\(1\)号顶点出发,每次随机选择某条边走到下一个顶点,并将\(ans\)加上这条边的编号,走到\(N\)号顶点时结束.请你对边进行编号,使总分期 ...
随机推荐
- javascript-原生-面向对象
1.javascript面向对象程序设计 概述:javascript不想其他面向对象编程语言那样有类的概念,javascript没有类(构造函数)的概念,只有对象的概念. 2.理解javascript ...
- JavaScript中的函数、参数、变量
高中大学数学很差,学JavaScript,发现根本不理解其中的函数.参数.变量等概念. 李永乐老师教学视频:<高三数学复习100讲>函数 bilibili.com/video/av5087 ...
- SharkCTF2021 BabyGame
web类题. 访问题给页面,页面里没啥信息.抓包,发现: 访问它,发现是一个游戏. F12之后看调试器里的js代码,发现: console.log("balabalabala"); ...
- 【Spring】IoC容器 - Spring Bean作用域Scope(含SpringCloud中的RefreshScope )
前言 上一章学习了[依赖来源],本章主要讨论SpringBean的作用域,我们这里讨论的Bean的作用域,很大程度都是默认只讨论依赖来源为[Spring BeanDefinition]的作用域,因为在 ...
- 【c++ Prime 学习笔记】第7章 类
类的基本思想是数据抽象和封装 数据分离抽象是一种依赖于接口和实现分离的编程/设计技术.接口包括用户能执行的操作,实现包括类的数据成员.接口实现的函数体.定义类所需的各种私有函数 封装实现了类的接口和实 ...
- JuiceFS 如何帮助趣头条超大规模 HDFS 降负载
作者简介 王振华,趣头条大数据总监,趣头条大数据负责人. 王海胜,趣头条大数据工程师,10 年互联网工作经验,曾在 eBay.唯品会等公司从事大数据开发相关工作,有丰富的大数据落地经验. 高昌健,Ju ...
- Java:ThreadLocal小记
Java:ThreadLocal小记 说明:这是看了 bilibili 上 黑马程序员 的课程 java基础教程由浅入深全面解析threadlocal 后做的笔记 内容 ThreadLocal 介绍 ...
- SpringBoot小知识点
记录SpringBoot的小知识点 一.在 Spring 上下文刷新之前设置一些自己的环境变量 1.实现 EnvironmentPostProcessor 接口 2.spring.factories ...
- git常用的一些简单命令
1.如果一个文件被修改了,但是还没有使用 git add 命令,此时想取消这次修改,需要执行的命令如下: git checkout -- 文件名 2.如果一个文件执行了 git add ,此时想取消这 ...
- Windows内核基础知识-5-调用门(32-Bit Call Gate)
Windows内核基础知识-5-调用门(32-Bit Call Gate) 调用门有一个关键的作用,就是用来提权.调用门其实就是一个段. 调用门: 这是段描述符的结构体,里面的s字段用来标记是代码段还 ...