【LOJ 2542】【PKUWC2018】 随机游走(最值反演 + 树上期望dp)
哇我太菜啦555555
不妨钦定我们需要访问的点集为$S$,在$S$已知的情况下,我们令$f(x) $表示从$x$走到点集$S$中任意一点的期望步数。
若$x∈S$,则显然$f(x)=0$,否则$f[x]=\frac{1}{d[x]}\sum f[ch[x]]+1$。其中$d[x]$表示与$x$相连的节点个数,$ch[x]$为与$x$相连的节点。
然后就列出了$n$条式子,显然是一个$n$元一次方程,可以考虑用高斯消元去求解,这样时间复杂度是$O(n^32^{n})$,只能拿$60$分(然而我考场上是零分啊呜呜呜)
我们考虑用些快速点的方法,考虑将$f[x]$化为$A_xf[fa[x]]+B_x$。其中$fa[x]$表示$x$的父亲。则
$f[x]=A_x[fa[x]]+B_x=\frac{1}{d[x]}\sum f[ch[x]]$
$f[x]=\frac{1}{d[x]}f[fa[x]]+\frac{1}{d[x]}(A_{ch[x]}f[x]+B_{ch[x]})+1$。
经过化简后,得
$f[x]= \dfrac{f[fa[x]]+\sum B_{ch[x]}+1}{d[u]-\sum A_{ch[x]}}$
我们令$g[S]$表示从给定起点$X$出发,走到集合$S$中任意一个点的期望步数。
那么显然,$g[S]=f[X]$。求出所有状态的期望的时间复杂度显然为$O(n 2^n)$。
我们令$G[S]$表示从给定起点$X$出发,将集合$S$中每个点至少走一次的期望步数。
根据$min-max$容斥的相关内容,有
$G[S]=\sum_{i∈S}g[i]\times (-1)^{|i|+1}$
然后我们可以花$O(3^n)$枚举子集,预处理出所有答案。
查询的时候$O(1)$查询即可。
完结撒花
#include<bits/stdc++.h>
#define M 18
#define MOD 998244353
#define L long long
using namespace std; L pow_mod(L x,L k){
L ans=;
while(k){
if(k&) ans=ans*x%MOD;
x=x*x%MOD; k>>=;
}
return ans;
} L d[M]={},invd[M]={};
struct edge{int u,next;}e[M<<]={}; int head[M]={},use=;
void add(int x,int y){use++;e[use].u=y;e[use].next=head[x];head[x]=use;} L f[<<M]={},ans[<<M]={},zf[<<M]={},a[M]={},b[M]={}; int ok[<<M]={}; int n,q,rt;
void dfs(int x,int fa,int S){
if((<<x)&S) return;
for(int i=head[x];i;i=e[i].next)
if(e[i].u!=fa){
dfs(e[i].u,x,S);
b[x]+=b[e[i].u];
a[x]+=a[e[i].u];
}
b[x]%=MOD; a[x]%=MOD;
L inv=pow_mod((d[x]-a[x]+MOD)%MOD,MOD-);
a[x]=inv;
b[x]=(b[x]*inv+inv*d[x])%MOD;
} void solve(int x){
ok[x]=;
for(int i=x;i;i=x&(i-))
ans[x]+=zf[i]*f[i];
ans[x]=(ans[x]%MOD+MOD)%MOD;
} int main(){
//freopen("a.out","w",stdout);
scanf("%d%d%d",&n,&q,&rt); rt--;
for(int i=;i<n;i++){
int x,y; scanf("%d%d",&x,&y);
x--; y--; add(x,y); add(y,x);
d[x]++; d[y]++;
}
for(int i=;i<n;i++) invd[i]=pow_mod(d[i],MOD-);
int hh=<<n;
for(int i=;i<hh;i++){
memset(a,,sizeof(a));
memset(b,,sizeof(b));
dfs(rt,-,i);
f[i]=b[rt]; zf[i]=-;
for(int j=;j<n;j++)
if((<<j)&i) zf[i]=-zf[i];
}
while(q--){
int k,hh=; scanf("%d",&k);
while(k--){
int x; scanf("%d",&x);
hh+=<<(x-);
}
if(!ok[hh]) solve(hh);
printf("%lld\n",ans[hh]);
}
}
【LOJ 2542】【PKUWC2018】 随机游走(最值反演 + 树上期望dp)的更多相关文章
- LOJ #2542. 「PKUWC 2018」随机游走(最值反演 + 树上期望dp + FMT)
写在这道题前面 : 网上的一些题解都不讲那个系数是怎么推得真的不良心 TAT (不是每个人都有那么厉害啊 , 我好菜啊) 而且 LOJ 过的代码千篇一律 ... 那个系数根本看不出来是什么啊 TAT ...
- loj 2542 随机游走 —— 最值反演+树上期望DP+fmt
题目:https://loj.ac/problem/2542 因为走到所有点的期望就是所有点期望的最大值,所以先最值反演一下,问题变成从根走到一个点集任意一点就停止的期望值: 设 \( f[x] \) ...
- LOJ #2542 [PKUWC2018]随机游走 (概率期望、组合数学、子集和变换、Min-Max容斥)
很好很有趣很神仙的题! 题目链接: https://loj.ac/problem/2542 题意: 请自行阅读 题解首先我们显然要求的是几个随机变量的最大值的期望(不是期望的最大值),然后这玩意很难求 ...
- [LOJ#2542] [PKUWC2018] 随机游走
题目描述 给定一棵 n 个结点的树,你从点 x 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 Q 次询问,每次询问给定一个集合 S,求如果从 x 出发一直随机游走,直到点集 S 中所有点都 ...
- LOJ2542 随机游走 Min-Max容斥+树上期望DP
搞了一下午 真的是啥都不会 首先这道题要用到Min-Max容斥 得到的结论是 设 $Max(S)$表示集合里最晚被访问的节点被访问的期望步数 设 $Min(S)$表示集合里最早被访问的节点被访问的期望 ...
- 【LOJ#2542】[PKUWC2018]随机游走(min-max容斥,动态规划)
[LOJ#2542][PKUWC2018]随机游走(min-max容斥,动态规划) 题面 LOJ 题解 很明显,要求的东西可以很容易的进行\(min-max\)容斥,那么转为求集合的\(min\). ...
- LOJ2542 PKUWC2018 随机游走 min-max容斥、树上高斯消元、高维前缀和、期望
传送门 那么除了D1T3,PKUWC2018就更完了(斗地主这种全场0分的题怎么会做啊) 发现我们要求的是所有点中到达时间的最大值的期望,\(n\)又很小,考虑min-max容斥 那么我们要求从\(x ...
- 【洛谷5643】[PKUWC2018] 随机游走(Min-Max容斥+待定系数法+高维前缀和)
点此看题面 大致题意: 从一个给定点出发,在一棵树上随机游走,对于相邻的每个点均有\(\frac 1{deg}\)的概率前往.多组询问,每次给出一个点集,求期望经过多少步能够访问过点集内所有点至少一次 ...
- [PKUWC2018] 随机游走
Description 给定一棵 \(n\) 个结点的树,你从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 \(Q\) 次询问,每次询问给定一个集合 \(S\),求如果从 ...
随机推荐
- LNMP 网站搭建
https://lnmp.org/ lnmp这个一键安装:https://lnmp.org/install.html wget -c http://soft.vpser.net/lnmp/lnmp1. ...
- RNA分析要点
1. 有参与无参转录组分析 2. lncRNA分析 以RNA-Seq测序技术为基础的转录组测序作为高通量测序时代核心技术之一,已在生物科学及医学领域前沿研究中获得广泛应用.RNA-Seq可进行全基因组 ...
- 【Log】logback指定配置文件(二)
通常我们在不同的环境使用不同的日志配置文件,本章讲指定logback的配置文件,如何使用logback参照[Log]logback的配置和使用(一) 写一个配置加载类,注意JoranConfigura ...
- 2018.08.19 NOIP模拟 number(类数位dp)
Number 题目背景 SOURCE:NOIP2015-SHY-10 题目描述 如果一个数能够表示成两两不同的 3 的幂次的和,就说这个数是好的. 比如 13 是好的,因为 13 = 9 + 3 + ...
- hdu-1128(数学问题,筛数)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1128 思路:从0,开始,每次求一个数x的d(x),然后判断如果x没有标记,则说明x没有由任意一个d(i ...
- 微分方程数值解Euler法
微分方程:dy/dt=1+y; 解是y=2exp(x)-1; clc clear figure() dx=0.1; x=:dx:; y=zeros(size(x)); x()=; y()=; :len ...
- Caused by: java.lang.IllegalArgumentException: error at ::0 can't find referenced pointcut aaa
这个错误是说,找不到这个注释: 解决方案: 1.更改自己本机的jdk版本(我的更改了无效): 在工程选择框内点击右键--->build path----->Library--->ad ...
- Deployment is out of date due to changes in the underlying project contents. Deployment is out of date due to changes in the underlying project contents. You'll need to manually 'Redeploy' the projec
原因1:导入的jar包路径不对,造成第一个错误, 原因2:设置右键工程->属性->myeclipse->web->deployment选use workbenk defaul ...
- VHDL实例化过程
第二步:建立一个名为MUX_0的乘法器 第三步:在程序中例化,看以下程序. -- 该程序用来实现复数的乘法,端口分别定义的复数的 -- 输入的实部和虚部和输出的实部和虚部 LIBRARY IEEE; ...
- windows开启禁用网卡
' 在Windows中实现sudo命令--命令行环境中获取管理员权限 'ShellExecute 方法 '作用: 用于运行一个程序或脚本. '语法 ' .ShellExecute "appl ...