哇我太菜啦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)的更多相关文章

  1. LOJ #2542. 「PKUWC 2018」随机游走(最值反演 + 树上期望dp + FMT)

    写在这道题前面 : 网上的一些题解都不讲那个系数是怎么推得真的不良心 TAT (不是每个人都有那么厉害啊 , 我好菜啊) 而且 LOJ 过的代码千篇一律 ... 那个系数根本看不出来是什么啊 TAT ...

  2. loj 2542 随机游走 —— 最值反演+树上期望DP+fmt

    题目:https://loj.ac/problem/2542 因为走到所有点的期望就是所有点期望的最大值,所以先最值反演一下,问题变成从根走到一个点集任意一点就停止的期望值: 设 \( f[x] \) ...

  3. LOJ #2542 [PKUWC2018]随机游走 (概率期望、组合数学、子集和变换、Min-Max容斥)

    很好很有趣很神仙的题! 题目链接: https://loj.ac/problem/2542 题意: 请自行阅读 题解首先我们显然要求的是几个随机变量的最大值的期望(不是期望的最大值),然后这玩意很难求 ...

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

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

  5. LOJ2542 随机游走 Min-Max容斥+树上期望DP

    搞了一下午 真的是啥都不会 首先这道题要用到Min-Max容斥 得到的结论是 设 $Max(S)$表示集合里最晚被访问的节点被访问的期望步数 设 $Min(S)$表示集合里最早被访问的节点被访问的期望 ...

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

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

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

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

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

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

  9. [PKUWC2018] 随机游走

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

随机推荐

  1. Oracle SQL 硬解析和子游标

    Oracle SQL 硬解析和子游标 What reasons will be happening sql hard parse and generating new child cursors 在一 ...

  2. 马婕 2014年MBA,mpacc备考 报刊宣读1 中国的电子商务(转)

    http://blog.sina.com.cn/s/blog_3e66af4601015fxi.html 中国电子商务蓄势待发 Chinese e-commerce中国电子商务Pity the par ...

  3. C++之类和对象的特性

    简介:C++并不是一个纯粹的面向对象的语言,而是一种基于过程和面向对象的混合型的语言. 凡是以类对象为基本构成单位的程序称为基于对象的程序,再加上抽象.封装.继承和多态就成为面向对象程序. 1.掌握类 ...

  4. IntelliJ IDEA 2017版 开发SpringBoot的全局配置文件使用

    一.全局配置文件 描述:     Spring Boot项目使用一个全局的配置文件application.properties或者是application.yml,在resources目录下或者类路径 ...

  5. LA 3213 Ancient Cipher (水题,转化)

    题意:给定两个长度相同的字符串,判断它们之间是否存在一一对应关系,顺序不定. 析:刚开始没看到顺序不定,然后写完没胡把样例看完就交了,结果WA了一次...其实这是一个水题,既然顺序不定,那么更简单,我 ...

  6. kallinux2.0安装网易云音乐

    安装 dpkg -i netease-cloud-music_1.0.0_amd64.kali2.0(yagami).deb apt-get -f install dpkg -i netease-cl ...

  7. 在mui中创建aJax来请求数据..并展示在页面上

    <!DOCTYPE html> <html> <head>     <meta charset="UTF-8">     <m ...

  8. MessageBox的常见用法

    一 函数原型及参数 function MessageBox(hWnd: HWND; Text, Caption: PChar; Type: Word): Integer; hWnd:对话框父窗口句柄, ...

  9. listview 异步加载

    http://www.iteye.com/topic/685986 ListView异步加载图片是非常实用的方法,凡是是要通过网络获取图片资源一般使用这种方法比较好,用户体验好,下面就说实现方法,先贴 ...

  10. OpenGl 中的基本数据类型

    OpenGl 中的基本数据类型 为了便于 OpenGL在各种平台上移植,OpenGL定义了自己的数据类型. 如果你愿意也可用这些数据类型对应的标准C的数据类型来替代.如OpenGL也定义 GLvoid ...