LOJ#2542 随机游走

时间:2023-01-20 11:40:12

LOJ#2542 随机游走

LOJ#2542 随机游走

解:首先minmax容斥变成经过集合t的第一个点就停止的期望步数。对于某个t,设从x开始的期望步数为f(x)

如果x∈t,f(x) = 0。否则f(x) = ∑f(y) / in[x] + 1

树上高斯消元。从叶子往上,可以发现每个点都可以表示为Af(fa) + B

于是我们推一波式子,参考,就可以对每个t,O(n)求出f(root)。

然后每个询问就枚举子集。

注意DFS的时候可以剪枝,遇到x∈t就返回,否则T飞.....

 #include <bits/stdc++.h>

 const int N = , MO = ;

 inline void read(int &x) {
x = ;
char c = getchar();
while(c < '' || c > '') c = getchar();
while(c >= '' && c <= '') {
x = x * + c - ;
c = getchar();
}
return;
} struct Edge {
int nex, v;
}edge[N << ]; int tp; int n, rt, e[N], A[N], B[N], now, in[N], ans[ << ], cnt[ << ], ans2[ << ]; inline int qpow(int a, int b) {
int ans = ;
a = (a + MO) % MO;
while(b) {
if(b & ) ans = 1ll * ans * a % MO;
a = 1ll * a * a % MO;
b = b >> ;
}
return ans;
} inline void add(int x, int y) {
tp++;
edge[tp].v = y;
edge[tp].nex = e[x];
e[x] = tp;
return;
} void DFS(int x, int f) {
if((( << (x - )) | now) == now) {
A[x] = B[x] = ;
return;
}
int sa = , sb = ;
for(int i = e[x]; i; i = edge[i].nex) {
int y = edge[i].v;
if(y == f) continue;
DFS(y, x);
sa = (sa + A[y]) % MO;
sb = (sb + B[y]) % MO;
} A[x] = qpow(in[x] - sa, MO - );
B[x] = 1ll * A[x] * (in[x] + sb) % MO; return;
} int main() {
int q;
read(n); read(q); read(rt);
for(register int i = , x, y; i < n; i++) {
read(x); read(y);
add(x, y); add(y, x);
in[x]++; in[y]++;
} int lm = << n;
/*for(now = 1; now < lm; now++) {
//memset(A, )
DFS(rt, 0);
ans[now] = B[rt];
}*/
memset(ans, -, sizeof(ans));
memset(ans2, -, sizeof(ans2)); for(register int i = ; i < lm; i++) {
cnt[i] = + cnt[i - (i & (-i))];
} /// prework OVER
for(register int i = , k; i <= q; i++) {
read(k);
int s = ;
for(register int j = , x; j <= k; j++) {
read(x);
s |= ( << (x - ));
}
int Ans = ;
if(ans2[s] != -) {
Ans = ans2[s];
}
else {
for(register int t = s; t; t = (t - ) & s) {
if(ans[t] == -) {
now = t;
DFS(rt, );
ans[t] = B[rt];
}
if(cnt[t] & ) Ans = (Ans + ans[t]) % MO;
else Ans = (Ans - ans[t] + MO) % MO;
}
ans2[s] = Ans;
}
printf("%d\n", (Ans + MO) % MO);
} return ;
}

AC代码

LOJ#2542 随机游走的更多相关文章

  1. loj 2542 随机游走 —— 最值反演&plus;树上期望DP&plus;fmt

    题目:https://loj.ac/problem/2542 因为走到所有点的期望就是所有点期望的最大值,所以先最值反演一下,问题变成从根走到一个点集任意一点就停止的期望值: 设 \( f[x] \) ...

  2. Loj &num;2542&period; 「PKUWC2018」随机游走

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

  3. LOJ &num;2542&period; 「PKUWC 2018」随机游走&lpar;最值反演 &plus; 树上期望dp &plus; FMT&rpar;

    写在这道题前面 : 网上的一些题解都不讲那个系数是怎么推得真的不良心 TAT (不是每个人都有那么厉害啊 , 我好菜啊) 而且 LOJ 过的代码千篇一律 ... 那个系数根本看不出来是什么啊 TAT ...

  4. 【LOJ&num;2542】&lbrack;PKUWC2018&rsqb;随机游走(min-max容斥,动态规划)

    [LOJ#2542][PKUWC2018]随机游走(min-max容斥,动态规划) 题面 LOJ 题解 很明显,要求的东西可以很容易的进行\(min-max\)容斥,那么转为求集合的\(min\). ...

  5. LOJ &num;2542「PKUWC2018」随机游走

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

  6. LOJ &num;2542 &lbrack;PKUWC2018&rsqb;随机游走 &lpar;概率期望、组合数学、子集和变换、Min-Max容斥&rpar;

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

  7. &lbrack;LOJ&num;2542&rsqb; &lbrack;PKUWC2018&rsqb; 随机游走

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

  8. LOJ2542&period; 「PKUWC2018」随机游走

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

  9. 【Matlab】随机游走产生图像效果

    随机游走类似布朗运动,就是随机的向各个方向走吧.产生的图像实在漂亮,所以还是贴出分享. clear all; close all; clc; n=100000; x= 0; y= 0; pixel=z ...

随机推荐

  1. jquery 判断手势滑动方向(上下左右)

    $('body').on('click', '.placeholder img', function(e) { //touchstart在你之前发生,不管些什么,都先执行下面的 }); $('body ...

  2. 微信公开课(北京站)速记 微信、微信支付、O2O的定义与关联

    本文为4月29日微信公开课(北京站)微信产品部演讲全文速记,讲述了微信官方对微信.微信支付.O2O的定义与关联等问题的看法与观点. 作者:微信产品部 刘涵涛 吴毅 去年夏天有一个全民打飞机的盛况,这实 ...

  3. Java中几种常见的排序方式

    冒泡排序是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成.这个算法的名字 ...

  4. Asp&period;Net处理URL空格变&percnt;20问题

    在Web前端需要页面跳转的时候我们可能会这样子用:window.location.href = "page.html?parameters",如果刚好parameters里面带有空 ...

  5. Lua 常用的shell命令

    lua作为一种小巧的脚本语言,其函数等动作可以使用shell命令进行运行和调试,以下是几个常用的shell命令.基本格式是  lua [选项参数] [脚本参数] (1)%lua 程序名.lua     ...

  6. C&num;中操作WMI的类库-实现远程登录共享

    WMI是Windows Management Instrumentation的简称,即:视窗管理规范.在Windows 2000或以后的版本中均安装得有,NT4.0则需要安装WMI的核心组件.通过WM ...

  7. IOS制作一个漂亮的登录界面

    上图是Facebook的登录界面,看起来很漂亮,eamil框和passwod框合在一起,那么这种效果是怎么做出来的呢?我们都知道输入框用layer属性是可以做成圆角的形式,那么怎么样才能够仅仅只让上边 ...

  8. Delphi笔记(GL&lowbar;Scene四轴飞行器模型)

    有了前的一篇做铺垫,已经简单的说了GL_Scene的下载安装和一个简单的实例制作.现在就要开始制作一个3D的模型了,具体的步骤就不再这里多说了,直接上图和代码吧! [第一版]先看一下最开始的版本吧,比 ...

  9. openGL之坐标变换

  10. Spark(十四)SparkStreaming的官方文档

    一.SparkCore.SparkSQL和SparkStreaming的类似之处 二.SparkStreaming的运行流程 2.1 图解说明 2.2 文字解说 1.我们在集群中的其中一台机器上提交我 ...