题意:给一棵树,多次询问$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]随机游走的更多相关文章

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

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

  2. 介绍一个全局最优化的方法:随机游走算法(Random Walk)

    1. 关于全局最优化求解   全局最优化是一个非常复杂的问题,目前还没有一个通用的办法可以对任意复杂函数求解全局最优值.上一篇文章讲解了一个求解局部极小值的方法--梯度下降法.这种方法对于求解精度不高 ...

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

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

  4. LOJ #2542. 「PKUWC 2018」随机游走(最值反演 + 树上期望dp + FMT)

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

  5. 【LOJ2542】【PKUWC 2018】随机游走 min-max容斥 树上高斯消元

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

  6. [PKUWC2018] 随机游走

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

  7. 【LOJ#2542】[PKUWC2018]随机游走(min-max容斥,动态规划)

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

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

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

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

    「PKUWC2018」随机游走(min-max容斥+FWT) 以后题目都换成这种「」形式啦,我觉得好看. 做过重返现世的应该看到就想到 \(min-max\) 容斥了吧. 没错,我是先学扩展形式再学特 ...

随机推荐

  1. android OTA升级包制作

    0.签名 java -Xmx2048m -jar out/host/linux-x86/framework/signapk.jar -w build/target/product/security/t ...

  2. 如何在plsql/developer的命令窗口执行sql脚本

    在plsql/developer的命令窗口执行sql脚本的命令是@+路径 示例如下: 第一步:在C:\Users\linsenq\Desktop目录下新建一个脚本文件: test.sql test.s ...

  3. CentOS 6.5 Linux 安装 openoffice

    资源准备: Apache_OpenOffice_4.1.4_Linux_x86-64_install-rpm_zh-CN.tar.gz 编译安装: 本人资源包放在 /opt/moudles 中, 解压 ...

  4. 组合数学--Polya 原理及典型应用

    Redfield-Polya (Pólya enumeration theorem,简称PET)定理是组合数学理论中最重要的定理之一.自从 1927 年 Redfield 首次运用 group red ...

  5. 【SPOJ-QTREE】树链剖分

    树链剖分学习 https://blog.csdn.net/u013368721/article/details/39734871 https://www.cnblogs.com/George1994/ ...

  6. SELinux 案例 2

    普通进程权限白名单 sepolicy generate --application [-n NAME] [-u USER ]command [-w WRITE_PATH ]

  7. python--celery

    有些时候我们的一些任务比较耗时,比如我们写了一个网站,用户注册的时候需要发送邮件.但是发送邮件的过程比较耗时,用户必须要等到我们将邮件发送成功之后才会得到响应.那么有没有一种办法,当用户点击发送邮件的 ...

  8. python几个重要的函数(lambda,filter,reduce,map,zip)

    一.匿名函数lambda lambda argument1,argument2,...argumentN :expression using arguments 1.lambda是一个表达式,而不是一 ...

  9. centos7安装tengine强制使用HTTPS访问

    操作系统:centos7.2 x64tengine:Tengine/2.2.0主机IP: 10.0.0.12 一.安装tengine 1.1 下载源码安装包 1.1.1 源码包pcre-8.40   ...

  10. Selenium2+python自动化20-Excel数据参数化【转载】

    前言 问: Python 获取到Excel一列值后怎么用selenium录制的脚本中参数化,比如对登录用户名和密码如何做参数化? 答:可以使用xlrd读取Excel的内容进行参数化.当然为了便于各位小 ...