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

很好很有趣很神仙的题!

题目链接: https://loj.ac/problem/2542

题意: 请自行阅读

题解首先我们显然要求的是几个随机变量的最大值的期望(不是期望的最大值),然后这玩意很难求,根据Min-Max容斥化成最小值的期望来求。

Minn-max容斥是指\(\max(x_1,x_2,...,x_n)=\sum{S\in {1,2,...,n}} (-1)^{|S|-1} \min_{i\in S}(x_i)\) (所有元素都是正整数,这个尽管式子本身和期望没关系但是经常是求期望的时候用它)

这个式子可以如此理解: 若把每个正整数\(x\)看作集合\({1,2,...,x}\)的话,则\(\max\)就是集合并,\(\min\)就是集合交,容斥原理直接推论

所以我们\(O(2^n)\)枚举每个关键点的子集,然后问题转化为: 按照同样的规则随机游走,走到任何一个关键点时即停,问期望步数

然后可以设\(dp[x]\)表示\(x\)节点作为起始点的期望步数

若\(x\)是关键点,\(dp[x]=0\), 否则\(dp[x]=\frac{1}{du[x]}\sum_{Edge(u,v)}{dp[v]}+1\) (\(du[]\)是度数)

然后我们就可以愉快地来个高斯消元\(O(2^nn^3)\)处理单个询问了。(能得多少分别问我,没试过……)

神仙之处在下面: \(O(n)\)求解树上高消

由于这是棵树,所以我们如果dfs的话,可以把\(dp[x]\)记成一个关于\(dp[fa]\) (\(fa\)是父亲)的一次函数,形如\(dp[x]=A_xdp[fa]+B_x\).

然后假设现在做到点\(u\)(非根)则\[dp[u]=\frac{dp[fa]+\sum_{v\in son(u)}{A_vdp[u]+B_v}}{du[u]}+1\]

\[(1-\frac{\sum_{v\in son(u)}{a_v}}{du[u]})dp[u]=\frac{dp[fa]}{du[u]}+(\frac{\sum_{v\in son(u)}B_v}{du[u]}+1)\]

归纳易证,只要有特殊点(\(A=B=0\))的存在,等式左边\(dp[u]\)的系数恒大于\(0\), 因此除过去就完成了\(A\)和\(B\)的递推!

裸做时间复杂度\(O(2^nnq)\), 子集和变换(高维前缀和,又称FMT)可以做到\(O(2^nn)\)预处理\(O(1)\)查询

代码

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<utility>
#define llong long long
using namespace std;const int N = 18;
const int P = 998244353;
llong fact[(1<<N)+3],finv[(1<<N)+3];
struct Edge
{int v,nxt;
} e[(N<<1)+3];
int cnt[(1<<N)+3];
llong f[(1<<N)+3];
int fe[N+3];
int fa[N+3];
int du[N+3];
int n,q,s,en;llong quickpow(llong x,llong y)
{llong cur = x,ret = 1ll;for(int i=0; y; i++){if(y&(1ll<<i)) {y-=(1ll<<i); ret = ret*cur%P;}cur = cur*cur%P;}return ret;
}
llong mulinv(llong x) {return quickpow(x,P-2);}void addedge(int u,int v)
{du[u]++;en++; e[en].v = v;e[en].nxt = fe[u]; fe[u] = en;
}void dfs0(int u)
{for(int i=fe[u]; i; i=e[i].nxt){if(e[i].v==fa[u]) continue;fa[e[i].v] = u;dfs0(e[i].v);}
}pair<llong,llong> dfs(int u,int sta)
{
//  printf("dfs(%d)\n",u);if(sta&(1<<u)) {return make_pair(0,0);}pair<llong,llong> ret = make_pair(1,1);if(u!=s && du[u]==1) return ret;llong s1 = 0ll,s2 = 0ll;for(int i=fe[u]; i; i=e[i].nxt){if(e[i].v==fa[u]) continue;pair<llong,llong> tmp = dfs(e[i].v,sta);s1 = (s1+tmp.first)%P,s2 = (s2+tmp.second)%P;}ret.first = mulinv(du[u]-s1+P)%P; ret.second = ret.first*(s2+du[u])%P;return ret;
}int main()
{cnt[0] = 0; for(int i=1; i<(1<<N); i++) cnt[i] = cnt[i>>1]+(i&1);scanf("%d%d%d",&n,&q,&s); s--;for(int i=1; i<n; i++){int x,y; scanf("%d%d",&x,&y); x--; y--;addedge(x,y); addedge(y,x);}fa[s] = -1; dfs0(s);for(int i=1; i<(1<<n); i++){if(i&(1<<s)) {f[i] = 0ll; continue;}pair<llong,llong> tmp = dfs(s,i);f[i] = tmp.second;if((cnt[i]&1)==0) {f[i] = P-f[i];}}for(int i=0; i<n; i++){for(int j=0; j<(1<<n); j++){if(j&(1<<i)) {f[j] = (f[j]+f[j^(1<<i)])%P;}}}for(int i=1; i<=q; i++){int n0; scanf("%d",&n0);int u = 0; for(int j=1; j<=n0; j++) {int x; scanf("%d",&x); x--; u+=(1<<x);}printf("%lld\n",f[u]);}return 0;
}

发表于 2019-05-25 20:51 suncongbo 阅读(...) 评论(...) 编辑 收藏

刷新评论刷新页面返回顶部

loj#2542 [PKUWC2018]随机游走 (概率期望、组合数学、子集和变换、Min-Max容斥)相关推荐

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

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

  2. P3175 [HAOI2015]按位或(Min - Max容斥,FMT,概率期望,全网最清晰的题解!)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Weblink https://www.luogu.com.cn/problem/P3175 Prob ...

  3. 树上随机游走的期望距离

    无聊写写(顺便背板) d[i]表示i的度数,每条边的长度均为1(虽然不是1也能做,但是好写啊) 我们设FiFi表示i走到它父亲的期望距离,则 Fi=1+(∑j是i的儿子Fj+Fi+1)d[i] Fi= ...

  4. 第2章【思考与练习3】随机游走轨迹模拟。将随机游走的步数增加到100步,计算物体最终与原点的距离。重复多次随机游走过程,观察物体与原点距离的变化趋势。

    P33思考练习题3 1.将随机游走的步数增加到100步,计算物体最终与原点的距离. #第1题 #模拟每步生成方向 import numpy as np steps = 100 rndwlk = np. ...

  5. LOJ#2542. 「PKUWC2018」随机游走

    LOJ#2542. 「PKUWC2018」随机游走 题目描述 Solution 去过一个点集中所有节点的期望时间不好求,考虑min−maxmin-maxmin−max容斥,转化为求第一次到达某一个点集 ...

  6. 「PKUWC2018」随机游走

    Min-Max容斥真好用 LOJ #2542 题意:给一棵不超过1818个节点的树,50005000次询问,每次问从根随机游走走遍一个集合的期望步数 Solution: 考虑Min-Max容斥 有Ma ...

  7. 最值反演[PKUWC2018][loj2542]随机游走

    前言 这是学习容斥过程中的一个比较裸的题了 题意简介 题目链接 题目大意 给出一棵nnn个点的树,给出树上的一个点xxx 现在进行QQQ次询问,每次询问一个点集,求从xxx点开始进行随机随机游走,第一 ...

  8. 高斯消元配合概率dp-图上随机游走模型

    题目1:[HNOI2013]游走 题目大意 给你一张无向连通图,从第111点随机游走到nnn点.花费为经过的边的编号的和.问你如何安排边的编号使得期望花费最小化. n≤500,m≤n2n \leq 5 ...

  9. 概率统计笔记:白噪声与随机游走

    1 白噪声 1.1 定义         白噪声是一个理想中的时序模型,它有一个重要的特性,即序列不相关:一个白噪声序列中的每一个点都独立的来自某个未知的分布,即它们满足独立同分布. 考虑时间序列 . ...

最新文章

  1. delphi 插入表格HTML代码
  2. 《深入理解Nginx:模块开发与架构解析》一1.2 为什么选择Nginx
  3. 8000 字 + 21 张图,服务端高并发分布式架构 14 次演进之路
  4. 安卓手机开机键失灵,FASTBOOT模式ADB重启
  5. 多层陶瓷电容器用处_陶瓷材料|MLCC片式多层陶瓷电容器应用及制作工艺介绍...
  6. docker修改容器映射的端口_解密 Docker 挂载文件,宿主机修改后容器里文件没有修改...
  7. 北京一公交车发生爆炸 疑为乘客携带药品起反应
  8. Ubuntu通过可视化界面配置 查找IP地址不存在的解决办法
  9. java 和 Android Base64加密,java开发面试笔试题
  10. 一个动态路由OSPF配置实例(eNSP)
  11. 【Java】---JVM内存模型
  12. 阿兹卡班(azikaban)报错:syntax error:unexpected end of file
  13. 常见的平均查找长度总结
  14. [feather]StarlingUi框架——初识feather、界面启动及Ui加载
  15. hexo博客中插入图片失败——解决思路及个人最终解决办法
  16. 改变生物学研究进程:AI模型打开生命信息密码
  17. python入门的详细答案_第11篇参考答案:Python入门经典习题题解
  18. 国产全新 OS 惊艳老外!界面似 Win11,可运行多应用
  19. 高通骁龙800系列处理器规格型号及代表机型大全
  20. 什么是ROC曲线?为什么要使用ROC?以及 AUC的计算

热门文章

  1. sqlserver中查找存储过程中的关键字方法之二
  2. 在应用环境中如何构造最优的数据库模式
  3. go语言中处处可见的for循环
  4. BugkuCTF-Misc:又一张图片,还单纯吗
  5. 二维数组中的查找---剑指Offer
  6. C++ 二维数组和指针数组
  7. FFmpeg再学习 -- FFmpeg+SDL+MFC实现图形界面视频播放器
  8. C语言再学习 -- 关键字struct(转)
  9. 斯特林公式(Stirling's approximation)
  10. android Spinner点击事件处理