LOJ2542 PKUWC2018 随机游走 min-max容斥、树上高斯消元、高维前缀和、期望
那么除了D1T3,PKUWC2018就更完了(斗地主这种全场0分的题怎么会做啊)
发现我们要求的是所有点中到达时间的最大值的期望,\(n\)又很小,考虑min-max容斥
那么我们要求从\(x\)走到第一个属于某个子集\(S\)的节点的步数期望,这是一个经典的树上高斯消元问题。
将树设为以\(x\)为根,设\(f_{i , S}\)为从第\(i\)个点随机游走到达点集\(S\)任意一个点停止,行走步数的期望,转移:
\(1.i \in S: f_{i , S}=0\)
\(2.i \not\in S : f_{i , S} = \frac{1}{in_i} \sum\limits_{(i,j) \in e}f_{j,S} + 1\)
直接这么做是\(O(2^nn^3)\)的,但是因为树上的优美性质,高斯消元可以做到\(O(n)\)。
首先对于一个点集\(S\)中的点\(t\),\(t\)的子树是没有必要的,可以截去。
然后对于所有叶子节点\(k\),要么\(f_{k , S} = 0\) ,要么\(f_{k , S} = f_{fa_k , S} + 1\)。可以发现对于当前的某一个点\(x\),如果它的所有子节点\(y\)都是叶子节点,可以通过消元将\(f_{x,S}\)变为\(k \times f_{fa_k , S} + b\)的形式,其中\(k,b\)都是常数。这么按照无根树拓扑序推上去,可以知道除根结点的所有节点\(x\),\(f_{x , S} = k \times f_{fa_x , S} + b\)的形式,而根结点可以推出\(f_{x,S} = b\),就可以求出来从根结点走到第一个属于\(S\)的节点的步数期望了。
乘上\(-1^{|S| + 1}\)之后,题目求的最大值期望实质上就是一个子集和,高维前缀和之后\(O(1)\)回答询问,总复杂度\(O(n2^n + Q)\)。
#include<bits/stdc++.h>
//This code is written by Itst
using namespace std;
inline int read(){
int a = 0;
char c = getchar();
bool f = 0;
while(!isdigit(c) && c != EOF){
if(c == '-')
f = 1;
c = getchar();
}
if(c == EOF)
exit(0);
while(isdigit(c)){
a = a * 10 + c - 48;
c = getchar();
}
return f ? -a : a;
}
const int MOD = 998244353;
struct Edge{
int end , upEd;
}Ed[41];
int head[21] , dp[1 << 18] , du[21] , k[21] , b[21] , cnt1[1 << 18];
int N , Q , R , cntEd;
inline int poww(long long a , int b){
int times = 1;
while(b){
if(b & 1)
times = times * a % MOD;
a = a * a % MOD;
b >>= 1;
}
return times;
}
inline void addEd(int a , int b){
Ed[++cntEd].end = b;
Ed[cntEd].upEd = head[a];
head[a] = cntEd;
++du[b];
}
void dfs(int x , int p , int S){
if(S & (1 << x)){
k[x] = b[x] = 0;
return;
}
k[x] = 1;
b[x] = 0;
int t = poww(du[x] , MOD - 2);
for(int i = head[x] ; i ; i = Ed[i].upEd)
if(Ed[i].end != p){
dfs(Ed[i].end , x , S);
k[x] = (k[x] - 1ll * k[Ed[i].end] * t % MOD + MOD) % MOD;
b[x] = (b[x] + 1ll * t * b[Ed[i].end]) % MOD;
}
k[x] = poww(k[x] , MOD - 2);
b[x] = 1ll * (b[x] + 1) * k[x] % MOD;
k[x] = 1ll * k[x] * t % MOD;
}
int main(){
#ifndef ONLINE_JUDGE
freopen("in","r",stdin);
freopen("out","w",stdout);
#endif
N = read();
Q = read();
R = read() - 1;
for(int i = 1 ; i < N ; ++i){
int a = read() - 1 , b = read() - 1;
addEd(a , b);
addEd(b , a);
}
for(int i = 1 ; i < 1 << N ; ++i){
dfs(R , -1 , i);
dp[i] = b[R];
}
for(int i = 1 ; i < 1 << N ; ++i){
cnt1[i] = cnt1[i >> 1] + (i & 1);
if(!(cnt1[i] & 1))
dp[i] = dp[i] ? MOD - dp[i] : 0;
}
for(int i = 0 ; i < N ; ++i)
for(int j = 1 ; j < 1 << N ; ++j)
if(!(j & (1 << i)))
(dp[j | (1 << i)] += dp[j]) %= MOD;
for(int i = 1 ; i <= Q ; ++i){
int S = 0;
for(int j = read() ; j ; --j)
S += 1 << (read() - 1);
printf("%d\n" , dp[S]);
}
return 0;
}
LOJ2542 PKUWC2018 随机游走 min-max容斥、树上高斯消元、高维前缀和、期望的更多相关文章
- 【LOJ#2542】[PKUWC2018]随机游走(min-max容斥,动态规划)
[LOJ#2542][PKUWC2018]随机游走(min-max容斥,动态规划) 题面 LOJ 题解 很明显,要求的东西可以很容易的进行\(min-max\)容斥,那么转为求集合的\(min\). ...
- loj2542 「PKUWC2018」随机游走 MinMax 容斥+树上高斯消元+状压 DP
题目传送门 https://loj.ac/problem/2542 题解 肯定一眼 MinMax 容斥吧. 然后问题就转化为,给定一个集合 \(S\),问期望情况下多少步可以走到 \(S\) 中的点. ...
- 洛谷 P5643 - [PKUWC2018]随机游走(Min-Max 容斥+FWT+树上高斯消元,hot tea)
题面传送门 一道挺综合的 hot tea,放到 PKUWC 的 D2T2 还挺喜闻乐见的( 首先我们考虑怎样对一个固定的集合 \(S\) 计算答案,注意到我们要求的是一个形如 \(E(\max(S)) ...
- 【LOJ2542】【PKUWC 2018】随机游走 min-max容斥 树上高斯消元
题目描述 有一棵 \(n\) 个点的树.你从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 \(q\) 次询问,每次询问给定一个集合 \(S\),求如果从 \(x\) 出发一 ...
- 【洛谷5643】[PKUWC2018] 随机游走(Min-Max容斥+待定系数法+高维前缀和)
点此看题面 大致题意: 从一个给定点出发,在一棵树上随机游走,对于相邻的每个点均有\(\frac 1{deg}\)的概率前往.多组询问,每次给出一个点集,求期望经过多少步能够访问过点集内所有点至少一次 ...
- 「PKUWC2018」随机游走(min-max容斥+FWT)
「PKUWC2018」随机游走(min-max容斥+FWT) 以后题目都换成这种「」形式啦,我觉得好看. 做过重返现世的应该看到就想到 \(min-max\) 容斥了吧. 没错,我是先学扩展形式再学特 ...
- LOJ2542 PKUWC2018随机游走(概率期望+容斥原理)
如果直接dp,状态里肯定要带上已走过的点的集合,感觉上不太好做. 考虑一种对期望的minmax容斥:其中Max(S)为遍历完S集合的期望步数,Min(S)为遍历到S集合中一个点的期望步数.当然才不管怎 ...
- BZOJ3141 Hnoi2013 游走 【概率DP】【高斯消元】*
BZOJ3141 Hnoi2013 Description 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点 ...
- 【BZOJ3143】【HNOI2013】游走 && 【BZOJ3270】博物馆 【高斯消元+概率期望】
刚学完 高斯消元,我们来做几道题吧! T1:[BZOJ3143][HNOI2013]游走 Description 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小 ...
随机推荐
- javascript选项卡切换样式
HTML代码 <ul class="touzi_xuan1" id="qixian"> <li>****: </li> &l ...
- 安卓开发_浅谈TimePicker(时间选择器)
TimePicker也继承自FrameLayout类.时间选择控件向用户显示一天中的时间(可以为24小时,也可以为AM/PM制),并允许用户进行选择.如果要捕获用户修改时间数据的事件,便需要为Time ...
- Jni OnLoad()和OnUnload()
除了前面说的自定义JNI函数之外,JNI还提供了两个特殊函数,它们是JNI_OnLoad()和JNI_OnUnload(),分别在加载库和卸载库的时候调用. 1.JNI_OnLoad() Java调用 ...
- matlab练习程序(FAST特征点检测)
算法思想:如果一个像素与它邻域的像素差别较大(过亮或过暗) , 那它更可能是角点. 算法步骤: 1.上图所示,一个以像素p为中心,半径为3的圆上,有16个像素点(p1.p2.....p16). 2.定 ...
- js判断IE浏览器及版本
function isIE(_version){ _version = _version || ''; var b = document.createElement('b'); b.innerHTML ...
- 【HANA系列】SAP HANA XS使用服务器JavaScript Libraries详解
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA XS使用服务器 ...
- Linux Regulator Framework(2)_regulator driver
转自蜗窝科技:http://www.wowotech.net/pm_subsystem/regulator_driver.html 说实话,这篇好难懂啊... 1. 前言 本文从regulator d ...
- AD域自定义属性《完整》
1.安装Active Directory 架构,下载:adminpak.msi安装. 2.以管理员运行cmd,执行:regsvr32 schmmgmt.dll(该命令将在计算机上注册“schmmgmt ...
- zabbix-Get value from agent failed: cannot connect to [[127.0.0.1]:10050]: [111] Connection refused
监控zabbix服务端这台服务器,然后显示Get value from agent failed: cannot connect to [[127.0.0.1]:10050]: [111] Conne ...
- 【16】有关python面向对象编程
面向对象编程 一.第一个案例---创建类 #__author:"吉" #date: 2018/10/27 0027 #function: # 设计类: ''' 1 类名:首字母大写 ...