[Contest20180116]随机游走
题意:给一棵树,多次询问$a$到$b$期望步数,每一步都是随机的
对期望DP了解更深入了一些
先预处理$up_x$表示从$x$走到$fa_x$的期望步数
可以直接往上走,也可以先去儿子再回来,设$x$的度数为$d_x$
所以$up_x=\dfrac{1}{d_x}+\sum\limits_{p\in son_x}\dfrac{1}{d_x}\left(1+up_p+up_x\right)$
整理得$up_x=d_x+\sum\limits_{p\in son_x}up_p$
再预处理$down_x$表示从$fa_x$走到$x$的期望步数
可以直接往下走,也可以先去其他儿子再回来,也可以先去爷爷再回来
所以$down_x=\dfrac{1}{d_x}+\dfrac{1}{d_x}\left(1+down_{fa_x}+down_x\right)+\sum\limits_{\substack{p\in son_{fa_x}\\p\ne x}}\dfrac{1}{d_x}\left(1+up_p+down_x\right)$
整理得$down_x=down_{fa_x}+up_{fa_x}-up_x$
dp求出$up$和$down$之后求前缀和,用倍增求lca,一上一下的期望直接加起来即可
#include<stdio.h>
#define ll long long
int to[200010],nex[200010],h[100010],d[100010],dep[100010],fa[100010][17],tot;
ll up[100010],dn[100010];
void add(int a,int b){
tot++;
to[tot]=b;
nex[tot]=h[a];
h[a]=tot;
}
void dfs1(int x){
up[x]=d[x];
for(int i=h[x];i;i=nex[i]){
if(to[i]!=fa[x][0]){
fa[to[i]][0]=x;
dep[to[i]]=dep[x]+1;
dfs1(to[i]);
up[x]+=up[to[i]];
}
}
}
void dfs2(int x){
for(int i=h[x];i;i=nex[i]){
if(to[i]!=fa[x][0]){
dn[to[i]]=dn[x]+up[x]-up[to[i]];
dfs2(to[i]);
}
}
}
void dfs3(int x){
for(int i=h[x];i;i=nex[i]){
if(to[i]!=fa[x][0]){
up[to[i]]+=up[x];
dn[to[i]]+=dn[x];
dfs3(to[i]);
}
}
}
void swap(int&a,int&b){a^=b^=a^=b;}
int lca(int x,int y){
int i;
if(dep[x]<dep[y])swap(x,y);
for(i=16;i>=0;i--){
if(dep[fa[x][i]]>=dep[y])x=fa[x][i];
}
if(x==y)return x;
for(i=16;i>=0;i--){
if(fa[x][i]!=fa[y][i]){
x=fa[x][i];
y=fa[y][i];
}
}
return fa[x][0];
}
int main(){
int n,m,i,j,a,b;
scanf("%d",&n);
for(i=1;i<n;i++){
scanf("%d%d",&a,&b);
d[a]++;
d[b]++;
add(a,b);
add(b,a);
}
dep[1]=1;
dfs1(1);
for(j=1;j<17;j++){
for(i=1;i<=n;i++)fa[i][j]=fa[fa[i][j-1]][j-1];
}
dfs2(1);
dfs3(1);
scanf("%d",&m);
while(m--){
scanf("%d%d",&a,&b);
j=lca(a,b);
printf("%lld\n",up[a]-up[j]+dn[b]-dn[j]);
}
}
[Contest20180116]随机游走的更多相关文章
- 【Matlab】随机游走产生图像效果
随机游走类似布朗运动,就是随机的向各个方向走吧.产生的图像实在漂亮,所以还是贴出分享. clear all; close all; clc; n=100000; x= 0; y= 0; pixel=z ...
- 介绍一个全局最优化的方法:随机游走算法(Random Walk)
1. 关于全局最优化求解 全局最优化是一个非常复杂的问题,目前还没有一个通用的办法可以对任意复杂函数求解全局最优值.上一篇文章讲解了一个求解局部极小值的方法--梯度下降法.这种方法对于求解精度不高 ...
- Loj #2542. 「PKUWC2018」随机游走
Loj #2542. 「PKUWC2018」随机游走 题目描述 给定一棵 \(n\) 个结点的树,你从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 \(Q\) 次询问,每次 ...
- LOJ #2542. 「PKUWC 2018」随机游走(最值反演 + 树上期望dp + FMT)
写在这道题前面 : 网上的一些题解都不讲那个系数是怎么推得真的不良心 TAT (不是每个人都有那么厉害啊 , 我好菜啊) 而且 LOJ 过的代码千篇一律 ... 那个系数根本看不出来是什么啊 TAT ...
- 【LOJ2542】【PKUWC 2018】随机游走 min-max容斥 树上高斯消元
题目描述 有一棵 \(n\) 个点的树.你从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 \(q\) 次询问,每次询问给定一个集合 \(S\),求如果从 \(x\) 出发一 ...
- [PKUWC2018] 随机游走
Description 给定一棵 \(n\) 个结点的树,你从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 \(Q\) 次询问,每次询问给定一个集合 \(S\),求如果从 ...
- 【LOJ#2542】[PKUWC2018]随机游走(min-max容斥,动态规划)
[LOJ#2542][PKUWC2018]随机游走(min-max容斥,动态规划) 题面 LOJ 题解 很明显,要求的东西可以很容易的进行\(min-max\)容斥,那么转为求集合的\(min\). ...
- LOJ #2542「PKUWC2018」随机游走
$ Min$-$Max$容斥真好用 $ PKUWC$滚粗后这题一直在$ todolist$里 今天才补掉..还要更加努力啊.. LOJ #2542 题意:给一棵不超过$ 18$个节点的树,$ 5000 ...
- 「PKUWC2018」随机游走(min-max容斥+FWT)
「PKUWC2018」随机游走(min-max容斥+FWT) 以后题目都换成这种「」形式啦,我觉得好看. 做过重返现世的应该看到就想到 \(min-max\) 容斥了吧. 没错,我是先学扩展形式再学特 ...
随机推荐
- debounce 与 throttle 区别
原文地址:http://undefinedblog.com/debounce-and-throttle/ 二.什么是debounce 1. 定义 如果用手指一直按住一个弹簧,它将不会弹起直到你松 ...
- Could not resolve com.android.support:multidex:1.0.2
http://blog.csdn.net/goodlixueyong/article/details/50992835
- C# 序列化原因 (转)
1.什么是序列化 序列化是将对象状态转换为可保持或传输的格式的过程,在序列化过程中,对象的公共字段和私有字段以及类的名称(包括包含该类的程序集)都被转换为字节流,然后写入数据流.与序列化相对 ...
- css做中划线与文字排版
html: <div class="spilt"> <span class="left"></span> < ...
- Nios II 中的缓存和内存数据的读写
nios 使用地址中31bit来表示访问是否bypass cache.如果bit 31=0 表示不bypass cache,即使用cache里的数据:如果bit 31=1表示bypass cache, ...
- 【SPOJ - QTREE2】树链剖分
http://acm.hust.edu.cn/vjudge/problem/19960 题意: 有一棵N个节点的树(1<=N<=10000),N-1条边,边的编号为1~N-1,每条边有一个 ...
- bzoj4764: 弹飞大爷 link-cut-tree
题目传送门 这道题啊 调了一个晚上 因为写的是一个有根树和n个基环的写法 所以写得很奇怪..... 最后发现单独处理树的时候不能随意改变S(就是原来的根)不然size会出错.... #include& ...
- spoj p104 Matrix-Tree定理
这个问题就是经典的生成树记数问题,题目为spoj p104 highway. 首先我们引入Matrix-Tree定理,由kirchhoff证明,定理的概述为,对于图G,我们定义若干个矩阵, D[G], ...
- javascript批量输入表单
void((function(){ x=document.getElementsByTagName("a"); y = x[1] y.click() })()) void((fun ...
- 转: Photoshop cs6 快捷键命令大全
转自: http://www.cnblogs.com/zhen656/p/4249759.html 工具箱(多种工具共用一个快捷键的可同时按[Shift]加此快捷键选取) 矩形.椭圆选框工具.单行单列 ...