loj2542「PKUWC2018」随机游走
题目描述
给定一棵 nn 个结点的树,你从点 xx 出发,每次等概率随机选择一条与所在点相邻的边走过去。
有 QQ 次询问,每次询问给定一个集合 SS,求如果从 xx 出发一直随机游走,直到点集 SS 中所有点都至少经过一次的话,期望游走几步。
特别地,点 xx(即起点)视为一开始就被经过了一次。
答案对 998244353998244353 取模。
输入格式
第一行三个正整数 n,Q,xn,Q,x。
接下来 n-1n−1 行,每行两个正整数 (u,v)(u,v) 描述一条树边。
接下来 QQ 行,每行第一个数 kk 表示集合大小,接下来 kk 个互不相同的数表示集合 SS。
输出格式
输出 QQ 行,每行一个非负整数表示答案。
数据范围与提示
对于 20\%20% 的数据,有 1\leq n,Q\leq 51≤n,Q≤5。
另有 10\%10% 的数据,满足给定的树是一条链。
另有 10\%10% 的数据,满足对于所有询问有 k=1k=1。
另有 30\%30% 的数据,满足 1\leq n\leq 10 ,Q=11≤n≤10,Q=1。
对于 100\%100% 的数据,有 1\leq n\leq 181≤n≤18,1\leq Q\leq 50001≤Q≤5000,1\leq k\leq n1≤k≤n。
题解:
- 单点询问可以用高斯消元;
- 这个做法直接扩展到集合的话可以求出到$S$中任意一个点的期望步数;
- 如果对于一种状态,记录$S$中每个点被走到的步数$t$;
- 那么$S$中每个点都走到就是$t$的最大值,而刚刚求出来的是$t$的最小值;
- 套用最值反演:$max{S} = \sum_{T \subseteq S ,T \neq \emptyset } (-1)^{|T|-1} min{T}$;
- 现在只需要快速求出到$S$中任意一个点的期望步数,设$f_{u}$为$u$到$S$的期望步数:
- 可以得到:
- $f_{u} = \frac{1}{d_{u}} \sum_{v} f_{v} + 1 $
- 这里$v$表示和$u$相邻的点;
- 由于是一颗树,单独考虑父亲;
- $f_{u} = \frac{1}{d_{u}} f_{fa} + \frac{1}{d_{u}} \sum_{v}f_{v} + 1$ ①
- 这里$v$表示$u$的儿子节点;
- 假设已经处理好了$u$的儿子,为了能够递推,将式子写成:
- $f_{u} = A_{u}f_{fa} + B_{u}$ ②
- 那么$A_{v}$和$B_{v}$是已经处理好的,对①中的$v$用②,再对比化简的①和②:
- $$f_{u} = \frac{1}{d_{u} - \sum_{v}A_{v} } f_{fa} + \frac{d_{u} + \sum_{v}B_{v} }{d_{u} - \sum_{v} A_{v}}$$
- 这样就可以$O(n)$递推$AB$
- 用$fmt$处理反演部分的话,复杂度就是:$O(n2^n \ + \ q )$;
#include<bits/stdc++.h>
#define mod 998244353
using namespace std;
const int N=,M=;
int n,q,s,S,num[<<],f[<<],o=,hd[N],A[N],B[N],d[N],inv[M];
struct Edge{int v,nt;}E[N<<];
void adde(int u,int v){
E[o]=(Edge){v,hd[u]};hd[u]=o++;
E[o]=(Edge){u,hd[v]};hd[v]=o++;
}
inline int Inv(int x){return x<1e5?inv[x]:1ll*(mod-mod/x)*Inv(mod%x)%mod;}
void dfs(int u,int fa){
if(S&<<(u-)){A[u]=B[u]=;return;}
int s1=,s2=;
for(int i=hd[u];i;i=E[i].nt){
int v=E[i].v;
if(v==fa)continue;
dfs(v,u);
s1=(s1+A[v])%mod,s2=(s2+B[v])%mod;
}
A[u]=Inv((d[u]-s1+mod)%mod);
B[u]=1ll*A[u]*(s2+d[u])%mod;
}
int main(){
#ifndef ONLINE_JUDGE
freopen("loj2542.in","r",stdin);
freopen("loj2542.out","w",stdout);
#endif
scanf("%d%d%d",&n,&q,&s);
inv[]=;
for(int i=;i<=1e5;++i)inv[i]=1ll*(mod-mod/i)*inv[mod%i]%mod;
for(int i=,u,v;i<n;++i){
scanf("%d%d",&u,&v);
adde(u,v);
d[u]++,d[v]++;
}
for(int i=;i<<<n;++i){
S=i;dfs(s,);
num[i]=num[i>>]+(i&);
f[i]=(num[i]&)?B[s]:(mod-B[s])%mod;
}
for(int i=;i<n;++i)
for(int j=<<i;j<<<n;++j){
if(j>>i&)f[j]=(f[j]+f[j^(<<i)])%mod;
}
for(int i=,k;i<=q;++i){
scanf("%d",&k);
S=;for(int j=,x;j<=k;++j)scanf("%d",&x),S^=<<(x-);
printf("%d\n",f[S]);
}
return ;
}
loj2542「PKUWC2018」随机游走的更多相关文章
- LOJ2542. 「PKUWC2018」随机游走
LOJ2542. 「PKUWC2018」随机游走 https://loj.ac/problem/2542 分析: 为了学习最值反演而做的这道题~ \(max{S}=\sum\limits_{T\sub ...
- loj2542 「PKUWC2018」随机游走 【树形dp + 状压dp + 数学】
题目链接 loj2542 题解 设\(f[i][S]\)表示从\(i\)节点出发,走完\(S\)集合中的点的期望步数 记\(de[i]\)为\(i\)的度数,\(E\)为边集,我们很容易写出状态转移方 ...
- LOJ2542. 「PKUWC2018」随机游走【概率期望DP+Min-Max容斥(最值反演)】
题面 思路 我们可以把到每个点的期望步数算出来取max?但是直接算显然是不行的 那就可以用Min-Max来容斥一下 设\(g_{s}\)是从x到s中任意一个点的最小步数 设\(f_{s}\)是从x到s ...
- loj2542 「PKUWC2018」随机游走 MinMax 容斥+树上高斯消元+状压 DP
题目传送门 https://loj.ac/problem/2542 题解 肯定一眼 MinMax 容斥吧. 然后问题就转化为,给定一个集合 \(S\),问期望情况下多少步可以走到 \(S\) 中的点. ...
- Loj #2542. 「PKUWC2018」随机游走
Loj #2542. 「PKUWC2018」随机游走 题目描述 给定一棵 \(n\) 个结点的树,你从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 \(Q\) 次询问,每次 ...
- 「PKUWC2018」随机游走(min-max容斥+FWT)
「PKUWC2018」随机游走(min-max容斥+FWT) 以后题目都换成这种「」形式啦,我觉得好看. 做过重返现世的应该看到就想到 \(min-max\) 容斥了吧. 没错,我是先学扩展形式再学特 ...
- 【LOJ2542】「PKUWC2018」随机游走
题意 给定一棵 \(n\) 个结点的树,你从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 \(Q\) 次询问,每次询问给定一个集合 \(S\),求如果从 \(x\) 出发一 ...
- LOJ #2542「PKUWC2018」随机游走
$ Min$-$Max$容斥真好用 $ PKUWC$滚粗后这题一直在$ todolist$里 今天才补掉..还要更加努力啊.. LOJ #2542 题意:给一棵不超过$ 18$个节点的树,$ 5000 ...
- 「PKUWC2018」随机游走
题目 我暴力过啦 看到这样的东西我们先搬出来\(min-max\)容斥 我们设\(max(S)\)表示\(x\)到达点集\(S\)的期望最晚时间,也就是我们要求的答案了 显然我们也很难求出这个东西,但 ...
随机推荐
- ats Linux Bridge内联
Linux可以配置为在桥接模式下运行. 为网桥分配了两个或更多物理接口. 在接口之间共享单个IP地址. 默认情况下,任何到达一个接口的数据包都会立即路由到另一个网桥接口. 需要的Linux包: bri ...
- 2019CSUST集训队选拔赛题解(二)
凛冬将至 Description 维斯特洛大陆的原住民是森林之子,他们长得如孩童一般,善于使用石器,威力值35,用树叶树枝作为衣物,在森林里繁衍生息,与万物和平相处.他们会使用古老的魔法(比如绿之视野 ...
- CsvReader和CsvWriter操作csv文件
使用方法: 提供把实例数据输出到磁盘csv文件的功能 提供读取csv文件,并封装成指定实例的功能 小工具自己依赖了slf4j+logbak,以及fastJson,如果与系统冲突,可以在pom文件中去除 ...
- Refs 和 DOM
在常规的 React 数据流中,props 是父组件与子组件交互的唯一方式.要修改子元素,你需要用新的 props 去重新渲染子元素.然而,在少数情况下,你需要在常规数据流外强制修改子元素.被修改的子 ...
- oracle安装出错/runInstaller
http://blog.csdn.net/yabingshi_tech/article/details/48313955 http://www.cnblogs.com/lihaozy/archive/ ...
- Beta阶段基于spec评论作品
组名:杨老师粉丝群 组长:乔静玉 组员:吴奕瑶 刘佳瑞 公冶令鑫 杨磊 刘欣 张宇 卢帝同 一.测试目标:拉格朗日2018——飞词 下面是他们的小游戏在运行时的一些截图画面: 1.开始界面 ...
- 互评Beta版本——二次元梦之队——“I Do”
基于NABCD评论作品,及改进建议 1.根据(不限于)NABCD评论作品的选题 (1)N(Need,需求) 这是一款可以教学新手入门编程的软件,不断的通关让他们慢慢学会编程,可以让没有接触过编程的人了 ...
- 【Alpha】技术规格说明书
由于第1周已经写过技术规格说明书(设计文档),本周更新了上一版内容. Github地址:https://github.com/buaase/Phylab-Web/blob/master/docs/Ba ...
- 自学iOS-获取当前时间
NSDate * senddate=[NSDate date]; NSDateFormatter *dateformatter=[[NSDateFormatter alloc] init]; [dat ...
- 项目Beta冲刺(团队)第七天
1.昨天的困难 服务器部署出了问题,本地服务器差点崩掉 运行一直闪退,在查找哪里出现问题的路上一去不复返 2.今天解决的进度 成员 进度 陈家权 消息功能模块 赖晓连 问答功能模块 雷晶 部署服务器到 ...