「PKUWC2018」随机游走(min-max容斥+FWT)

以后题目都换成这种「」形式啦,我觉得好看。

做过重返现世的应该看到就想到 \(min-max\) 容斥了吧。

没错,我是先学扩展形式再学特殊形式的。

\[E(\text{max}(S))=\sum_{T\subseteq S}(-1)^{|T|+1}E(\text{min}(T))
\]

问题转化之后,然后我们可以枚举所有状态然后 \(O(n)\) 树形 \(dp\)

\(-1\) 那项可以 \(O(2^n)\) 推出来,接下来就是子集变换了。可以 \(O(n2^n)\) \(FWT\) 或者 \(O(3^n)\) 暴力枚举,自己喜欢哪种就上吧。

\(Code\ Below:\)

#include <bits/stdc++.h>
using namespace std;
const int mod=998244353;
int n,q,rt,lim,bin[20],a[20],b[20],d[20],f[1<<18],g[1<<18];
vector<int> G[20]; inline int fpow(int a,int b){
int ret=1;
for(;b;b>>=1,a=1ll*a*a%mod)
if(b&1) ret=1ll*ret*a%mod;
return ret;
} void dfs(int x,int f,int S){
if(S&bin[x]) return ;
a[x]=d[x];b[x]=1;
int tmp=1,y;
vector<int>::iterator it;
for(it=G[x].begin();it!=G[x].end();it++){
y=*it;
if(y==f) continue;
dfs(y,x,S);
tmp=(tmp-1ll*a[y]*d[x]%mod+mod)%mod;
b[x]=(b[x]+1ll*b[y]*d[x]%mod)%mod;
}
tmp=fpow(tmp,mod-2);
a[x]=1ll*a[x]*tmp%mod;
b[x]=1ll*b[x]*tmp%mod;
} inline void FWT(){
for(int len=1;len<lim;len<<=1)
for(int i=0;i<lim;i++)
if(i&len) f[i]=(f[i]+f[i^len])%mod;
} int main()
{
scanf("%d%d%d",&n,&q,&rt);
rt--;lim=1<<n;bin[0]=1;
for(int i=1;i<=n;i++) bin[i]=bin[i-1]<<1;
int x,y,k,S;
for(int i=0;i<n-1;i++){
scanf("%d%d",&x,&y);
x--;y--;
G[x].push_back(y);
G[y].push_back(x);
d[x]++;d[y]++;
}
for(int i=0;i<n;i++) d[i]=fpow(d[i],mod-2);
for(int i=0;i<lim;i++){
for(int j=0;j<n;j++) a[j]=b[j]=0;
dfs(rt,-1,i);f[i]=b[rt];
}
g[0]=-1;
for(int i=1;i<lim;i++) g[i]=g[i>>1]*((i&1)?-1:1);
for(int i=0;i<lim;i++){
f[i]*=g[i];
if(f[i]<0) f[i]+=mod;
}
FWT();
while(q--){
scanf("%d",&k);S=0;
for(int i=1;i<=k;i++){
scanf("%d",&x);
S|=bin[x-1];
}
printf("%d\n",f[S]);
}
return 0;
}

「PKUWC2018」随机游走(min-max容斥+FWT)的更多相关文章

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

    Loj #2542. 「PKUWC2018」随机游走 题目描述 给定一棵 \(n\) 个结点的树,你从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 \(Q\) 次询问,每次 ...

  2. LOJ2542. 「PKUWC2018」随机游走

    LOJ2542. 「PKUWC2018」随机游走 https://loj.ac/problem/2542 分析: 为了学习最值反演而做的这道题~ \(max{S}=\sum\limits_{T\sub ...

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

    $ Min$-$Max$容斥真好用 $ PKUWC$滚粗后这题一直在$ todolist$里 今天才补掉..还要更加努力啊.. LOJ #2542 题意:给一棵不超过$ 18$个节点的树,$ 5000 ...

  4. 「PKUWC2018」随机游走

    题目 我暴力过啦 看到这样的东西我们先搬出来\(min-max\)容斥 我们设\(max(S)\)表示\(x\)到达点集\(S\)的期望最晚时间,也就是我们要求的答案了 显然我们也很难求出这个东西,但 ...

  5. loj2542「PKUWC2018」随机游走

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

  6. 【LOJ2542】「PKUWC2018」随机游走

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

  7. 洛谷 P5643 - [PKUWC2018]随机游走(Min-Max 容斥+FWT+树上高斯消元,hot tea)

    题面传送门 一道挺综合的 hot tea,放到 PKUWC 的 D2T2 还挺喜闻乐见的( 首先我们考虑怎样对一个固定的集合 \(S\) 计算答案,注意到我们要求的是一个形如 \(E(\max(S)) ...

  8. loj#2542. 「PKUWC2018」随机游走(树形dp+Min-Max容斥)

    传送门 首先,关于\(Min-Max\)容斥 设\(S\)为一个点的集合,每个点的权值为走到这个点的期望时间,则\(Max(S)\)即为走遍这个集合所有点的期望时间,\(Min(S)\)即为第一次走到 ...

  9. LOJ2542. 「PKUWC2018」随机游走【概率期望DP+Min-Max容斥(最值反演)】

    题面 思路 我们可以把到每个点的期望步数算出来取max?但是直接算显然是不行的 那就可以用Min-Max来容斥一下 设\(g_{s}\)是从x到s中任意一个点的最小步数 设\(f_{s}\)是从x到s ...

随机推荐

  1. leetcode31

    class Solution { public: void nextPermutation(vector<int>&nums) { int len = nums.size(); , ...

  2. leetcode34

    class Solution { public: vector<int> searchRange(vector<int>& nums, int target) { ve ...

  3. HTML - input(转)

    自: http://www.runoob.com 标签定义及使用说明 <input> 标签规定了用户可以在其中输入数据的输入字段. <input> 元素在 <form&g ...

  4. P1880 [NOI1995]石子合并-(环形区间dp)

    https://www.luogu.org/problemnew/show/P1880 解题过程:本次的题目把石子围成一个环,与排成一列的版本有些不一样,可以在后面数组后面再接上n个元素,表示连续n个 ...

  5. 关于extern的使用

    学的时候不认真总结,用的时候就一堆bug. 上回也是调extern调了半天,今天又犯老毛病. data 比如说是要用到的的在main函数中不断刷新的量.那么这个unsigned int data 要写 ...

  6. js中遇到的一些方法和函数

    这是一个笔记文章,方便日后复习. 加号的优先级高于三目运算符: console.log(') ? 'define' : 'undefine');//define setTimeout(code,mil ...

  7. CentOS 特殊变量($0、$1、$2、 $?、 $# 、$@、 $*)

    名称 说明 $0 脚本名称 $1-9 脚本执行时的参数1到参数9 $? 脚本的返回值 $# 脚本执行时,输入的参数的个数 $@ 输入的参数的具体内容(将输入的参数作为一个多个对象,即是所有参数的一个列 ...

  8. RFID数据清洗与数据清洗的区别

    RFID数据清洗和一般数据清洗的不同: RFID数据清洗已经跨越到硬件范畴!造成脏数据的原因是硬件原理和硬件所处环境本身!要提高RFID数据清洗能力,就必须同时研究技术原理和环境本身之间的互动关系,而 ...

  9. load 过高分析办法

    1.top -H 找到占用cpu较高的进程2.top -Hp pid 找到该进程下占用cpu较高的线程id3.sudo -u adminjstack -F 进程id > ~/stack.txt ...

  10. 【python深入】dict和list实现排序:sorted()和lambda的使用

    Python中经常需要对dict中的key值或者value值进行排序,可以通过sorted方法和lambda结合使用,接下来就是sorted()和lambda 一.sorted()和lambda so ...