loj#2542. 「PKUWC2018」随机游走(MinMax容斥 期望dp)
题意
Sol
考虑直接对询问的集合做MinMax容斥
设\(f[i][sta]\)表示从\(i\)到集合\(sta\)中任意一点的最小期望步数
按照树上高斯消元的套路,我们可以把转移写成\(f[x] = a_x f[fa] + b_x\)的形式
然后直接推就可以了
#include<bits/stdc++.h>
#define LL long long
using namespace std;
const int MAXN = 1e6 + 10, mod = 998244353;
inline int read() {
char c = getchar(); int x = 0, f = 1;
while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x * f;
}
int mul(int x, int y) {return 1ll * x * y % mod;}
int add(int x, int y) {if(x + y < 0) return x + y + mod; else return x + y >= mod ? x + y - mod : x + y;}
int fp(int a, int p) {
int base = 1;
for(; p; p >>= 1, a = mul(a, a))
if(p & 1) base = mul(base, a);
return base;
}
int inv(int x) {
x = (x + mod) % mod;
return fp(x, mod - 2);
}
int N, Q, S, Lim, g[MAXN], deg[MAXN], a[MAXN], b[MAXN], siz[MAXN];
vector<int> v[MAXN];
void dfs(int x, int fa, int sta) {
if(sta & (1 << x - 1)) {a[x] = b[x] = 0; return ;}
int ta = 0, tb = 0;
for(int i = 0; i < v[x].size(); i++) {
int to = v[x][i]; if(to == fa) continue;
dfs(to, x, sta);
ta += a[to]; tb += b[to];
}
a[x] = inv(deg[x] - ta);
b[x] = mul((tb + deg[x]), inv(deg[x] - ta));
}
int main() {
N = read(); Q = read(); S = read(); Lim = (1 << N) - 1;
for(int i = 1; i <= N - 1; i++) {
int x = read(), y = read();
v[x].push_back(y); v[y].push_back(x);
deg[x]++; deg[y]++;
}
for(int sta = 1; sta <= Lim; sta++) {
siz[sta] = siz[sta >> 1] + (sta & 1);
dfs(S, 0, sta);
g[sta] = b[S];
}
while(Q--) {
int k = read(), S = 0, ans = 0;
for(int i = 1; i <= k; i++) S |= (1 << (read() - 1));
for(int i = S; i; i = (i - 1) & S) {
if(siz[i] & 1) ans = add(ans, g[i]);
else ans = add(ans, -g[i]);
}
printf("%d\n", ans);
}
return 0;
}
loj#2542. 「PKUWC2018」随机游走(MinMax容斥 期望dp)的更多相关文章
- loj2542 「PKUWC2018」随机游走 MinMax 容斥+树上高斯消元+状压 DP
题目传送门 https://loj.ac/problem/2542 题解 肯定一眼 MinMax 容斥吧. 然后问题就转化为,给定一个集合 \(S\),问期望情况下多少步可以走到 \(S\) 中的点. ...
- Loj #2542. 「PKUWC2018」随机游走
Loj #2542. 「PKUWC2018」随机游走 题目描述 给定一棵 \(n\) 个结点的树,你从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 \(Q\) 次询问,每次 ...
- LOJ #2542「PKUWC2018」随机游走
$ Min$-$Max$容斥真好用 $ PKUWC$滚粗后这题一直在$ todolist$里 今天才补掉..还要更加努力啊.. LOJ #2542 题意:给一棵不超过$ 18$个节点的树,$ 5000 ...
- loj#2542. 「PKUWC2018」随机游走(树形dp+Min-Max容斥)
传送门 首先,关于\(Min-Max\)容斥 设\(S\)为一个点的集合,每个点的权值为走到这个点的期望时间,则\(Max(S)\)即为走遍这个集合所有点的期望时间,\(Min(S)\)即为第一次走到 ...
- LOJ 2542 「PKUWC2018」随机游走 ——树上高斯消元(期望DP)+最值反演+fmt
题目:https://loj.ac/problem/2542 可以最值反演.注意 min 不是独立地算从根走到每个点的最小值,在点集里取 min ,而是整体来看,“从根开始走到点集中的任意一个点就停下 ...
- 【LOJ】#2542. 「PKUWC2018」随机游走
题解 虽然我知道minmax容斥,但是--神仙能想到把这个dp转化成一个一次函数啊= = 我们相当于求给定的\(S\)集合里最后一个被访问到的点的时间,对于这样的max的问题,我们可以用容斥把它转化成 ...
- [LOJ2542][PKUWC2018]随机游走(MinMax容斥+树形DP)
MinMax容斥将问题转化为求x到S中任意点的最小时间. 树形DP,直接求概率比较困难,考虑只求系数.最后由于x节点作为树根无父亲,所以求出的第二个系数就是答案. https://blog.csdn. ...
- LOJ2542. 「PKUWC2018」随机游走
LOJ2542. 「PKUWC2018」随机游走 https://loj.ac/problem/2542 分析: 为了学习最值反演而做的这道题~ \(max{S}=\sum\limits_{T\sub ...
- 「PKUWC2018」随机游走(min-max容斥+FWT)
「PKUWC2018」随机游走(min-max容斥+FWT) 以后题目都换成这种「」形式啦,我觉得好看. 做过重返现世的应该看到就想到 \(min-max\) 容斥了吧. 没错,我是先学扩展形式再学特 ...
随机推荐
- Java原子操作类汇总
当程序更新一个变量时,如果是多线程同时更新这个变量,可能得到的结果与期望值不同.比如:有一个变量i,A线程执行i+1,B线程也执行i+1,经过两个线程的操作后,变量i的值可能不是期望的3,而是2.这是 ...
- webpack快速入门——实战技巧:webpack模块化配置
首先在根目录,新建一个webpack_config文件夹,然后新建entry_webpack.js文件,代码如下: const entry ={}; //声明entry变量 entry.path={ ...
- java保留小数点两位的4种方法
import java.math.BigDecimal; import java.text.DecimalFormat; import java.text.NumberFormat; public c ...
- day 50 AJAX 初入门
前情提要: jq 学不好,ajax 难用好, 食用先请先确保最起码的jq 能会用 https://www.cnblogs.com/baili-luoyun/p/10473518.html jq ...
- postgresql子查询优化(提升子查询)
问题背景 在开发项目过程中,客户要求使用gbase8s数据库(基于informix),简单的分页页面响应很慢.排查发现分页sql是先查询出数据在外面套一层后再取多少条,如果去掉嵌套的一层,直接获取则很 ...
- Java执行Shell脚本“No such file or directory” (win->Linux)异常的可能原因
转自:http://blog.csdn.net/zlpdaisy/article/details/6134314 用Runtime.getRuntime().exec()方法执行Linux的一个She ...
- IE中的userData
之前做项目时用到了localstorage,但是考虑到浏览器存在IE8以下不兼容问题,所以来介绍以下IE中的userData. 本地存储解决方案很多,比如Flash SharedObject.Goog ...
- 【数组】Set Matrix Zeroes
题目: Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place. cl ...
- Oracle 相关查询
--创建用户 create user zzg identified by zzg123; --修改用户的密码 alter user zzg identified by unis; --所有用户所在的表 ...
- Android 开发工具类 30_sendXML
String xml = "<?xml version=\"1.0" encoding=\"UTF-8"?> <persons> ...