LOJ#2542. 「PKUWC2018」随机游走

题目描述

Solution

去过一个点集中所有节点的期望时间不好求,考虑min−maxmin-maxmin−max容斥,转化为求第一次到达某一个点集的期望时间。

我们对于每一个点集sss,都求出fif_ifi​表示从iii结点到点集sss中某一个结点的期望步数。

每一次dpdpdp显然可以用树上高消完成,时间复杂度O(2nn)O(2^nn)O(2nn)。

接下来的min−maxmin-maxmin−max容斥回答询问是O(Q2n)O(Q2^n)O(Q2n)的,不够优秀。

所以我们预处理每一个集合的答案,朴素做法为O(3n)O(3^n)O(3n),可以用高维前缀和做到O(2nn)O(2^nn)O(2nn)。

#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <string>
#include <cstring>
#include <ctime>
#include <cassert>
#include <string.h>
//#include <unordered_set>
//#include <unordered_map>
//#include <bits/stdc++.h>#define MP(A,B) make_pair(A,B)
#define PB(A) push_back(A)
#define SIZE(A) ((int)A.size())
#define LEN(A) ((int)A.length())
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define fi first
#define se secondusing namespace std;template<typename T>inline bool upmin(T &x,T y) { return y<x?x=y,1:0; }
template<typename T>inline bool upmax(T &x,T y) { return x<y?x=y,1:0; }typedef long long ll;
typedef unsigned long long ull;
typedef long double lod;
typedef pair<int,int> PR;
typedef vector<int> VI;const lod eps=1e-11;
const lod pi=acos(-1);
const int oo=1<<30;
const ll loo=1ll<<62;
const int mods=998244353;
const int MAXN=600005;
const int INF=0x3f3f3f3f;//1061109567
/*--------------------------------------------------------------------*/
inline int read()
{int f=1,x=0; char c=getchar();while (c<'0'||c>'9') { if (c=='-') f=-1; c=getchar(); }while (c>='0'&&c<='9') { x=(x<<3)+(x<<1)+(c^48); c=getchar(); }return x*f;
}
vector<int> e[MAXN];
int A[MAXN],B[MAXN],f[MAXN],d[MAXN],flag[MAXN];
inline int upd(int x,int y){ return x+y>=mods?x+y-mods:x+y; }
inline int quick_pow(int x,int y)
{int ret=1;for (;y;y>>=1){if (y&1) ret=1ll*ret*x%mods;x=1ll*x*x%mods;}return ret;
}
void tree_dp(int x,int father)
{int sa=0,sb=0;for (auto v:e[x]){if (v==father) continue;tree_dp(v,x);sa=upd(sa,A[v]),sb=upd(sb,B[v]);}if (flag[x]) { A[x]=B[x]=0; return; }int t=quick_pow(upd(d[x],mods-sa),mods-2);A[x]=t;B[x]=1ll*upd(sb,d[x])*t%mods;
}
int main()
{int n=read(),Case=read(),rt=read();for (int i=1;i<n;i++){int u=read(),v=read();e[u].PB(v),e[v].PB(u),d[u]++,d[v]++;}for (int S=1;S<1<<n;S++){for (int i=1;i<=n;i++) if ((S>>(i-1))&1) flag[i]=1;tree_dp(rt,0);f[S]=B[rt]*((__builtin_popcount(S)&1)?1:-1);f[S]=upd(f[S],mods);for (int i=1;i<=n;i++) if ((S>>(i-1))&1) flag[i]=0;}for (int i=0;i<n;i++)for (int S=1;S<1<<n;S++)if ((S>>i)&1) f[S]=upd(f[S],f[S^(1<<i)]);while (Case--){int x=read(),S=0;while (x--) S|=1<<(read()-1);printf("%d\n",f[S]);}return 0;
}

LOJ#2542. 「PKUWC2018」随机游走相关推荐

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

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

  2. 「PKUWC2018」随机游走

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

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

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

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

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

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

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

  6. LOJ 2537 「PKUWC2018」Minimax

    BZOJ 5461. 线段树合并优化$dp$. 假设所有离散之后的权值$\in [1, m]$,对于一个点$x$它的权值是$i$的概率是$f(x, i)$,那么 1.假如这个点只有一个儿子$y$,那么 ...

  7. loj#2541. 「PKUWC2018」猎人杀

    传送门 思路太清奇了-- 考虑容斥,即枚举至少有哪几个是在\(1\)号之后被杀的.设\(A=\sum_{i=1}^nw_i\),\(S\)为那几个在\(1\)号之后被杀的人的\(w\)之和.关于杀了人 ...

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

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

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

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

最新文章

  1. AttributeError: ‘tuple‘ object has no attribute ‘group‘
  2. Angular 富文本编辑之路的探索
  3. html5倒计时秒杀怎么做,vue 设计一个倒计时秒杀的组件
  4. hadoop的安装与配置(伪分布式模式安装)
  5. 深度解析数据分析、大数据工程师和数据科学家的区别
  6. 关于 AWR/ASH 故障分析,我有 9 个问题不知当不当问?
  7. 英国脱欧:3/4的技术初创公司将面临严峻时期
  8. php TCPDF 生成pdf文件
  9. 管理学之父德鲁克:目标管理的八要素和七步骤
  10. 线性代数06 矩阵的逆以及求法
  11. 概率论的学习和整理11:伯努利试验的3种分布:0-1分支,几何分布, 二项分布
  12. linux(ubuntu)下实现鼠标侧键映射双击、鼠标中键 快捷键的方法—— 使用xbindkeys
  13. 高德地图---Poi搜索遇到的坑
  14. imutils基础(7)使用 OpenCV 查找轮廓中的极值点
  15. ggplot2作图之PcoA
  16. 分子动力学模拟gro格式转换为 car
  17. 你是否愿意为他人撑起一把伞?
  18. 新道格资讯 工会换届选举大会顺利召开
  19. 低代码开发平台建设步骤及思考
  20. MATLAB绘制散点图——plot

热门文章

  1. 千万别让爸妈帮你P图......
  2. 葛优:你们有看过我的作品吗?| 今日趣图
  3. 为什么程序员发现不了自己的BUG?
  4. java aop execution_Spring AOP -- execution表达式
  5. 红旗河最早设计计算机的目的,论红旗河的利弊及其替代方案
  6. java实现数字转mac,Java Ethernet.getSourceMAC方法代码示例
  7. dialog element 删掉标题_ElementUI 销毁Dialog数据(简单粗暴)
  8. 设置mysql表myisam_mysql myisam 优化设置设置
  9. php windows共享内存,关于php的共享内存的使用和研究之由起
  10. 新华字典java_新华字典查询示例代码