题面传送门

一道挺综合的 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)的更多相关文章

  1. 【LOJ#2542】[PKUWC2018]随机游走(min-max容斥,动态规划)

    [LOJ#2542][PKUWC2018]随机游走(min-max容斥,动态规划) 题面 LOJ 题解 很明显,要求的东西可以很容易的进行\(min-max\)容斥,那么转为求集合的\(min\). ...

  2. 「PKUWC2018」随机游走(min-max容斥+FWT)

    「PKUWC2018」随机游走(min-max容斥+FWT) 以后题目都换成这种「」形式啦,我觉得好看. 做过重返现世的应该看到就想到 \(min-max\) 容斥了吧. 没错,我是先学扩展形式再学特 ...

  3. LOJ2542 PKUWC2018 随机游走 min-max容斥、树上高斯消元、高维前缀和、期望

    传送门 那么除了D1T3,PKUWC2018就更完了(斗地主这种全场0分的题怎么会做啊) 发现我们要求的是所有点中到达时间的最大值的期望,\(n\)又很小,考虑min-max容斥 那么我们要求从\(x ...

  4. 【洛谷5643】[PKUWC2018] 随机游走(Min-Max容斥+待定系数法+高维前缀和)

    点此看题面 大致题意: 从一个给定点出发,在一棵树上随机游走,对于相邻的每个点均有\(\frac 1{deg}\)的概率前往.多组询问,每次给出一个点集,求期望经过多少步能够访问过点集内所有点至少一次 ...

  5. LOJ 2542 「PKUWC2018」随机游走 ——树上高斯消元(期望DP)+最值反演+fmt

    题目:https://loj.ac/problem/2542 可以最值反演.注意 min 不是独立地算从根走到每个点的最小值,在点集里取 min ,而是整体来看,“从根开始走到点集中的任意一个点就停下 ...

  6. loj2542 「PKUWC2018」随机游走 MinMax 容斥+树上高斯消元+状压 DP

    题目传送门 https://loj.ac/problem/2542 题解 肯定一眼 MinMax 容斥吧. 然后问题就转化为,给定一个集合 \(S\),问期望情况下多少步可以走到 \(S\) 中的点. ...

  7. [PKUWC2018] 随机游走

    Description 给定一棵 \(n\) 个结点的树,你从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 \(Q\) 次询问,每次询问给定一个集合 \(S\),求如果从 ...

  8. [LOJ#2542] [PKUWC2018] 随机游走

    题目描述 给定一棵 n 个结点的树,你从点 x 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 Q 次询问,每次询问给定一个集合 S,求如果从 x 出发一直随机游走,直到点集 S 中所有点都 ...

  9. 【洛谷3232】[HNOI2013] 游走(贪心+高斯消元)

    点此看题面 大致题意: 一个无向连通图,小\(Z\)从\(1\)号顶点出发,每次随机选择某条边走到下一个顶点,并将\(ans\)加上这条边的编号,走到\(N\)号顶点时结束.请你对边进行编号,使总分期 ...

随机推荐

  1. 第三次Alpha Scrum Meeting

    本次会议为Alpha阶段第三次Scrum Meeting会议 会议概要 会议时间:2021年4月26日 会议地点:线上会议 会议时长:20min 会议内容简介:本次会议主要由每个人展示自己目前完成的工 ...

  2. FastAPI 学习之路(三十三)操作数据库

    通过创建pydantic模型进行验证提交数据 from pydantic import BaseModel class UserBase(BaseModel): email: str class Us ...

  3. MOSFET管驱动电路的设计

    https://wenku.baidu.com/view/ae727da5caaedd3382c4d3b9.html?mark_pay_doc=2&mark_rec_page=1&ma ...

  4. OKhttp3的使用教程

    首先在build.gradle下的dependencies下添加引用. implementation "com.squareup.okhttp3:okhttp:4.9.0" 然后编 ...

  5. python网站(持续更新)

    python官网: https://www.python.org/ python文档:中文 https://docs.python.org/zh-cn/3/ pypi网站: https://pypi. ...

  6. vsftpd 编译安装 及 隐藏版本号

    环境:Redhat Enterprise Linux AS 4.0 update2(i386) 不提示,均表示以root权限执行. [注:]//为注释符,如"// 建立MySQL组" ...

  7. pku 2425 A Chess Game (SG)

    题意: 给一个由N个点组成的一张有向图,不存在环.点的编号是0~N-1. 然后给出M个棋子所在的位置(点的编号)[一个点上可同时有多个棋子]. 每人每次可移动M个棋子中的一个棋子一步,移动方向是有向边 ...

  8. Centos7下安装BlockScout

    简介 BlockScout是一个Elixir应用程序,允许用户搜索以太坊网络(包括所有叉子和侧链)上的交易,查看账户和余额以及验证智能合约.BlockScout为用户提供了一个全面,易于使用的界面,以 ...

  9. Spring Cloud Gateway实战之二:更多路由配置方式

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  10. 大白话讲解如何解决HttpServletRequest的请求参数只能读取一次的问题

    大家在开发过程中,可能会遇到对请求参数做下处理的场景,比如读取上送的参数中看调用方上送的系统编号是否是白名单里面的(更多的会用request中获取IP地址判断).需要对请求方上送的参数进行大小写转换或 ...