Min-Max容斥真好用

LOJ #2542

题意:给一棵不超过1818个节点的树,50005000次询问,每次问从根随机游走走遍一个集合的期望步数


Solution:

考虑Min-Max容斥

有Max(S)=∑T⊆S(−1)|T|+1Min(T)

其中S,T是一个集合,Max(S)表示S中最大元素,Min(S)同理

我们设集合S表示走到每个点的期望时间

显然走遍一个集合的期望时间就是Max(S)

且第一次走到某集合的期望时间是Min(S)

Max(S)不容易计算,我们转而求解Min(S)

令fi表示从点i随机游走第一次走到集合SS的期望步数

这个显然可以高斯消元,不过复杂度略大

由于转移是在树上,可以直接在树上O(n)消元

我们令fi=ki f fa[i]+bi

当ii在集合S中的时候ki=bi=0否则进行转移

转移的时候把当前点孩子的k和b算出然后代到当前点的方程中算出当前点的k和b

这样可以在O(2n⋅n∗算逆元复杂度)的时间复杂度内算出所有的Min(S)

然后直接容斥算Max(S),复杂度是5000∗2n的

我们可以提前预处理每个Max(S)每次枚举子集转移,时间复杂度是3^n的

据说都能过

不过其实这部分可以优化到2n∗n的

我们直接根据popcount(S)的奇偶性来判断是否给Min(S)乘上−1

然后直接高维前缀和即可

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define mod 998244353
#define ll long long
using namespace std;
struct ret{int k,b;ret operator +(const ret s)const{return {(k+s.k)%mod,(b+s.b)%mod};}ret operator *(const int s)const{return {(ll)k*s%mod,1ll*b*s%mod};}
}f[19][1<<18];
const int N=50;
int i,j,k,m,n,x,z,cnt,root,Q;
int g[N],l[N],c[N],a[N],d[N],inv[N],Min[1<<18];
void add(int x,int y){a[++k]=y;if (!g[x]) g[x]=k;else c[l[x]]=k;l[x]=k;
}
int pow(int x,int y){int ans=1;for (int i=y;i;i>>=1,x=(ll)x*x%mod)if (i&1) ans=(ll)x*ans%mod;;return (ans+mod)%mod;
}
ret dfs(int x,int pre,int s){if (s>>x-1&1) return{0,0}; ret now={0,0};for (int i=g[x];i;i=c[i])if (a[i]!=pre) now=now+dfs(a[i],x,s)*inv[d[x]];const int Inv=pow(1-now.k,mod-2);return {(ll)Inv*inv[d[x]]%mod,1ll*Inv*(now.b+1)%mod};
}
int main(){scanf("%d",&n);scanf("%d%d",&Q,&root);inv[0]=inv[1]=1;for (int i=2;i<=18;i++) inv[i]=(ll)inv[mod%i]*(mod-mod/i)%mod;for (int i=1;i<n;i++){int u,v;scanf("%d%d",&u,&v);add(u,v);add(v,u);d[u]++;d[v]++;}for (int i=1;i<(1<<n);i++){ret ans=dfs(root,root,i);Min[i]=ans.b*(__builtin_popcount(i)&1?1:-1);}for (int i=0;i<n;i++)for (int j=0;j<1<<n;j++)if (j>>i&1) (Min[j]+=Min[j^(1<<i)])%=mod;while (Q--){int sum=0;scanf("%d",&x);for(int i=1;i<=x;i++) {int y;scanf("%d",&y);sum|=(1<<y-1);}printf("%d\n",(Min[sum]+mod)%mod);}return 0;
}

View Code

转载于:https://www.cnblogs.com/zzrblogs/p/11196464.html

「PKUWC2018」随机游走相关推荐

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

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

  2. loj#2542. 「PKUWC2018」随机游走(MinMax容斥 期望dp)

    题意 题目链接 Sol 考虑直接对询问的集合做MinMax容斥 设\(f[i][sta]\)表示从\(i\)到集合\(sta\)中任意一点的最小期望步数 按照树上高斯消元的套路,我们可以把转移写成\( ...

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

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

  4. 【PKUWC2018】随机游走【Min-Max容斥】【树形dp】【FWT】

    题意:给一棵nnn个点的无权树和xxx,qqq次询问,每次给定一个点集SSS,询问从xxx开始每次随机走一步,SSS中的每个点至少被经过一次的期望步数. n≤18,q≤5000n\leq 18,q\l ...

  5. 【LOJ】 #2540. 「PKUWC2018」随机算法

    题解 感觉极其神奇的状压dp \(dp[i][S]\)表示答案为i,然后不可选的点集为S 我们每次往答案里加一个点,然后方案数是,设原来可以选的点数是y,新加入一个点后导致了除了新加的点之外x个点不能 ...

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

    loj#2542 [PKUWC2018]随机游走 (概率期望.组合数学.子集和变换.Min-Max容斥) 很好很有趣很神仙的题! 题目链接: https://loj.ac/problem/2542 题 ...

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

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

  8. 时间序列举例--------协方差+相关系数+随机游走+平稳性

    一. 时间序列的影响因素 (1) 长期趋势-------------这个是进行预测的三原则之一 (2) 循环变动或周期性----------------------预测的三原则之一 (3)季节性变动- ...

  9. KDD 2019 | 结合属性随机游走的图递归网络

    今天给大家介绍德克萨斯A&M大学的Xiao Huang等人在KDD 2019发表的一篇文章"Graph Recurrent Networks with Attributed Rand ...

最新文章

  1. 我在交大的数学建模经验!
  2. centos开机启动
  3. Tomcat集群+Nginx反向代理+负载均衡
  4. 2.1 基础-数字翻转
  5. php发送邮件smtp源码,php下使用SMTP发邮件的代码
  6. java ftp上传超时_有关java的ftp上传文件时断网的问题
  7. mysql是否需要设置外键_数据库到底需不需要设置外键?
  8. 【辨异】inner, internal, interior, inward
  9. 数控加工仿真系统 - FANUC OI 车床编程笔记(粗略)
  10. C#开源代码Newbeecoder.UI控件库极力推荐
  11. 74HC573的使用方法
  12. ZJYYC LSH去年买了个表(也是LZY去年买了个表) DFS
  13. 佛青云多少输出才能过鸿蒙,细节需慎重 现阶段佛青云多种路线选择
  14. 用户活跃度分析前端java_计算APP用户活跃度的方法及提升活跃度方案
  15. 方舟无限资源服务器,方舟生存进化无限资源版
  16. 【迁移学习】PointDAN: A Multi-Scale 3D Domain Adaption Network for Point Cloud Representation
  17. python数据清洗面试题_利用python进行数据清洗
  18. 楚留香服务器维护,楚留香手游3月9日维护更新公告
  19. 2018年Android面试题含答案--适合中高级
  20. Qt +百度地图+获取返回位置点

热门文章

  1. c语言数据结构学习心得——线性表
  2. 【python】解析Excel中使用xlrd库、xlwt库操作,使用xluils库修改Excel文件详解(三)...
  3. 消息推送与同步协议的思考
  4. ADB 无线连接设备
  5. [NOTE]常用Linux命令总结[Thx for commandlinefu]
  6. One Bug of WatiN?
  7. 软件工程第一次作业补充
  8. Thread class vs Runnnable interface(转)
  9. EditText 被遮挡和显示不全问题
  10. Delphi XE7 Update1修正列表