洛谷 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\)号顶点时结束.请你对边进行编号,使总分期 ...
随机推荐
- cs224n 2019
视频链接 相关资源 Notes 笔记下载 笔记2 需要挂梯子,不然不显示图片,如果用ssr,要调到全局模式 转自:bitJoy CS224N(1.8)introduction and Word Vec ...
- Convolutional Neural Network-week1编程题(TensorFlow实现手势数字识别)
1. TensorFlow model import math import numpy as np import h5py import matplotlib.pyplot as plt impor ...
- MySQL:提高笔记-2
MySQL:提高笔记-2 学完基础的语法后,进一步对 MySQL 进行学习,第一篇为:MySQL:提高笔记-1,这是第二篇内容 说明:这是根据 bilibili 上 黑马程序员 的课程 mysql入门 ...
- [no code][scrum meeting] Alpha 1
项目 内容 会议时间 2020-04-06 会议主题 团队任务分析与拆解 会议时长 30min 参会人员 全体成员 $( "#cnblogs_post_body" ).catalo ...
- STM32串口USART的使用方法和程序
通用同步异步收发器(USART)提供了一种灵活的方法来与使用工业标准NR 异步串行数据格式的外部设备之间进行全双工数据交换. USART利用分数波特率发生器提供宽范围的波特率选择,支持同步单向通信和半 ...
- Redis的浅入门
Redis的浅入门 # 缓存的思想 问题提出:我们的用户数量上亿,如果登录,访问数据库user特别耗时,该怎么办?--提出缓存 方法:怎样从缓存在获取数据? *有数据: 直接返回 *无数据: (1)从 ...
- sonar-project.propertie分析参数
SonarScanner 是当您的构建系统没有特定扫描仪时使用的扫描仪. 配置您的项目 在你的项目根目录中创建一个名为的配置文件 sonar-project.properties # must be ...
- 【做题记录】CF1444A Division
CF1444A Division 题意: 给定 \(t\) 组询问,每组给两个数 \(p_i\) 和 \(q_i\) ,找出最大的整数 \(x_i\) ,要求 \(p_i\) 可被 \(x_i\) 整 ...
- Hash算法:双重散列
双重散列是线性开型寻址散列(开放寻址法)中的冲突解决技术.双重散列使用在发生冲突时将第二个散列函数应用于键的想法. 此算法使用: (hash1(key) + i * hash2(key)) % TAB ...
- linux shell脚本中的开头#!/bin/bash的含义
对于linux上需要执行 的shell脚本,通常第一行的内容是 #!/bin/bash 当然有很多时候不规范的写法可以忽略掉这一句,执行起来好像也是ok,结果没什么不一样 .. 这只是因为在我们常用 ...