【数学期望】【LCA】【树形DP】树

题目大意

给你一棵有n个节点的树,以及m个询问,每个询问需要你回答一个点到另一个点要经过的期望边数

输入样例

4 2
1 2
2 3
3 4
1 4
3 4

输出样例

9
5 

数据范围

对于 20%20\%20%的数据,N⩽10.N \leqslant 10.N10.
对于 40%40\%40%的数据,N⩽1000.N \leqslant 1000.N1000.
另有 20%20\%20%的数据, 保证给定的树是一条链.
对于 100%100\%100%的数据, N⩽100000,Q⩽100000.N \leqslant 100000, Q \leqslant 100000.N100000,Q100000.

解题思路

树上两点之间的距离要先求lcalcalca,然后可以通过前缀和来得出两点到lcalcalca距离
对于前缀和我们要先得出某个点到父亲节点和儿子节点的期望距离
我们设
degxdeg_xdegx为点xxx的度数
dp1xdp1_xdp1x为点xxx到父亲节点的期望距离
dp2xdp2_xdp2x为点xxx的父亲节点到点x的期望距离
我们先算dp1dp1dp1
叶子结点到父亲节点的期望距离为1,因为只能往上
对于不是叶子结点的点xxx
它直接到父亲节点的期望是1degx\frac{1}{deg_x}degx11degx\frac{1}{deg_x}degx1的概率走这条边)
他到子节点i再回来再到父亲节点的期望是1+dp1i+dp1xdegx\frac{1+dp1_i+dp1_x}{deg_x}degx1+dp1i+dp1x
所以可以得到以下式子

dp1x=1degx+∑i∈sonx1+dp1i+dp1xdegxdp1_x=\frac{1}{deg_x}+\sum_{i\in son_x}\frac{1+dp1_i+dp1_x}{deg_x}dp1x=degx1+isonxdegx1+dp1i+dp1x
化简式子
dp1x=1degx+degx−1degx+(degx−1)dp1xdegx+∑i∈sonxdp1idegxdp1_x=\frac{1}{deg_x}+\frac{deg_x-1}{deg_x} + \frac{(deg_x-1)dp1_x}{deg_x} + \sum_{i\in son_x}\frac{dp1_i}{deg_x}dp1x=degx1+degxdegx1+degx(degx1)dp1x+isonxdegxdp1i
移项
dp1xdegxdegx−(degx−1)dp1xdegx=1degx+degx−1degx+∑i∈sonxdp1idegx\frac{dp1_x deg_x}{deg_x}-\frac{(deg_x-1)dp1_x}{deg_x}=\frac{1}{deg_x}+\frac{deg_x-1}{deg_x} + \sum_{i\in son_x}\frac{dp1_i}{deg_x}degxdp1xdegxdegx(degx1)dp1x=degx1+degxdegx1+isonxdegxdp1i
化简
dp1xdegx=1degx+degx−1degx+∑i∈sonxdp1idegx\frac{dp1_x}{deg_x}=\frac{1}{deg_x}+\frac{deg_x-1}{deg_x} + \sum_{i\in son_x}\frac{dp1_i}{deg_x}degxdp1x=degx1+degxdegx1+isonxdegxdp1i
同乘degxdeg_xdegx
dp1x=degx+∑i∈sonxdp1idp1_x=deg_x+ \sum_{i\in son_x}dp1_idp1x=degx+isonxdp1i
求出dp1后我们来求dp2
父亲节点直接到目标子节点的期望是1degfa\frac{1}{deg_{fa}}degfa1
父亲节点先到父亲节点的父亲节点然后回来再到目标子节点的期望是1+dp2fa+dp2xdegfa\frac{1+dp2_{fa}+dp2_x}{deg_{fa}}degfa1+dp2fa+dp2x
父亲节点先到其他子节点再回来再到目标子节点的期望是1+dp1i+dp2xdegfa\frac{1+dp1_i+dp2_x}{deg_{fa}}degfa1+dp1i+dp2x
所以我们得到式子
dp2x=1degfa+1+dp2fa+dp2xdegfa+∑i∈sonfa∣i≠x1+dp1i+dp2xdegfadp2_x=\frac{1}{deg_{fa}} + \frac{1+dp2_{fa}+dp2_x}{deg_{fa}}+\sum_{i\in son_{fa}|i\neq x}\frac{1+dp1_i+dp2_x}{deg_{fa}}dp2x=degfa1+degfa1+dp2fa+dp2x+isonfai=xdegfa1+dp1i+dp2x
化简式子
dp2x=1degfa+1+dp2fadegfa+dp2xdegfa+degfa−2degfa+(degfa−2)dp2xdegfa+∑i∈sonfa∣i≠xdp1idegfadp2_x=\frac{1}{deg_{fa}} + \frac{1+dp2_{fa}}{deg_{fa}} + \frac{dp2_x}{deg{fa}}+\frac{deg_{fa}-2}{deg_{fa}}+\frac{(deg_{fa}-2)dp2_x}{deg_{fa}}+\sum_{i\in son_{fa}|i\neq x}\frac{dp1_i}{deg_{fa}}dp2x=degfa1+degfa1+dp2fa+degfadp2x+degfadegfa2+degfa(degfa2)dp2x+isonfai=xdegfadp1i
移项
dp2xdegfadegfa−dp2xdegfa−(degfa−2)dp2xdegfa=1degfa+1+dp2fadegfa+degfa−2degfa+∑i∈sonfa∣i≠xdp1idegfa\frac{dp2_x deg_{fa}}{deg{fa}} - \frac{dp2_x}{deg{fa}} - \frac{(deg_{fa}-2)dp2_x}{deg_{fa}}=\frac{1}{deg_{fa}} + \frac{1+dp2_{fa}}{deg_{fa}} +\frac{deg_{fa}-2}{deg_{fa}}+\sum_{i\in son_{fa}|i\neq x}\frac{dp1_i}{deg_{fa}}degfadp2xdegfadegfadp2xdegfa(degfa2)dp2x=degfa1+degfa1+dp2fa+degfadegfa2+isonfai=xdegfadp1i
合并
dp2xdegfa=1degfa+1+dp2fadegfa+degfa−2degfa+∑i∈sonfa∣i≠xdp1idegfa\frac{dp2_x}{deg{fa}}=\frac{1}{deg_{fa}} + \frac{1+dp2_{fa}}{deg_{fa}} +\frac{deg_{fa}-2}{deg_{fa}}+\sum_{i\in son_{fa}|i\neq x}\frac{dp1_i}{deg_{fa}}degfadp2x=degfa1+degfa1+dp2fa+degfadegfa2+isonfai=xdegfadp1i
同乘degfadeg_{fa}degfa
dp2x=dp2fa+degfa+∑i∈sonfa∣i≠xdp1idp2_x=dp2_{fa} +deg_{fa}+\sum_{i\in son_{fa}|i\neq x}dp1_idp2x=dp2fa+degfa+isonfai=xdp1i
根据dp1xdp1_xdp1x的式子化简该式子
∵degfa+∑i∈sonfa∣i≠xdp1i=degfa+∑i∈sonfadp1i−dp1x=dp1fa−dp1x∴dp2x=dp2fa+dp1fa−dp1x\begin{aligned} \because deg_{fa}+\sum_{i\in son_{fa}|i\neq x}dp1_i & =deg_{fa}+\sum_{i\in son_{fa}}dp1_i-dp1_x \\ & =dp1_{fa}-dp1_x\end{aligned} \\ \therefore dp2_x=dp2_{fa} +dp1_{fa}-dp1_xdegfa+isonfai=xdp1i=degfa+isonfadp1idp1x=dp1fadp1xdp2x=dp2fa+dp1fadp1x
然后求前缀和,再求lcalcalca
然后求aaalcalcalca再到bbb的期望步数即可

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define wyc 1000000007
using namespace std;
ll n, m, x, y, z, g, tot, dep[110010], deg[110010], dp1[110010], dp2[110010], head[110010], f[110010][20];
struct rec
{ll to, next;
}a[210020];
void add(ll x, ll y)
{a[++tot].to = y;a[tot].next = head[x];head[x] = tot;return;
}
void dfs1(ll x, ll fa)//记录dp1
{f[x][0] = fa;//记录父亲dep[x] = dep[fa] + 1;//求深度dp1[x] = deg[x];for (int i = head[x]; i; i = a[i].next)if (a[i].to != fa){dfs1(a[i].to, x);dp1[x] = (dp1[x] + dp1[a[i].to]) % wyc;}return;
}
void dfs2(ll x, ll fa)//求dp2
{for (int i = head[x]; i; i = a[i].next)if (a[i].to != fa){dp2[a[i].to] = (dp1[x] - dp1[a[i].to] + dp2[x]) % wyc;dfs2(a[i].to, x);}return;
}
void dfs3(ll x, ll fa)//前缀和
{for (int i = head[x]; i; i = a[i].next)if (a[i].to != fa){dp1[a[i].to] = (dp1[a[i].to] + dp1[x]) % wyc;dp2[a[i].to] = (dp2[a[i].to] + dp2[x]) % wyc;dfs3(a[i].to, x);} return;
}
ll lca(ll x, ll y)
{if (dep[x] < dep[y]) g = x, x = y, y = g;for (int i = 16; i >= 0; --i)if (dep[x] - (1<<i) >= dep[y]) x = f[x][i];for (int i = 16; i >= 0; --i)if (f[x][i] != f[y][i]) x = f[x][i], y = f[y][i];return x == y?x:f[x][0];
}
int main()
{scanf("%lld%lld", &n, &m);for (int i = 1;i < n; ++i){scanf("%lld%lld", &x, &y);deg[x]++;deg[y]++;add(x, y);add(y, x);}dfs1(1, 1);dfs2(1, 1);dfs3(1, 1); for (int j = 1; j <= 16; ++j)for (int i = 1; i <= n; ++i)f[i][j] = f[f[i][j - 1]][j - 1];for (int i = 1; i <= m; ++i){scanf("%lld%lld", &x, &y);z = lca(x, y);printf("%lld\n", ((wyc + dp1[x] - dp1[z]) % wyc + (wyc + dp2[y] - dp2[z]) % wyc) % wyc);}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/320186.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

P3768-简单的数学题【莫比乌斯反演,杜教筛】

正题 题目链接:https://www.luogu.com.cn/problem/P3768 题目大意 给出n,pn,pn,p求∑i1n∑j1ngcd(i,j)∗i∗j\sum_{i1}^n\sum_{j1}^ngcd(i,j)*i*ji1∑n​j1∑n​gcd(i,j)∗i∗j模ppp的值。 解题思路 下文中定义Hy(x)∑i1xiyH_y(x)\sum_{i1}^xi^yHy​(x)∑i1x​iy 首先显然是…

.netcore consul实现服务注册与发现-单节点部署

一、Consul的基础介绍Consul是HashiCorp公司推出的开源工具&#xff0c;用于实现分布式系统的服务发现与配置。与其他分布式服务注册与发现的方案&#xff0c;比如 Airbnb的SmartStack等相比&#xff0c;Consul的方案更“一站式”&#xff0c;内置了服务注册与发现框 架、分布一…

MST(最小生成树)上的确定性和存在性问题

题目1&#xff1a; 给定一个n个点m条边的连通图&#xff0c;保证没有自环和重边。对于每条边求出,在其他边权值不变的情况下,它能取的最大权值&#xff0c;使得这条边在连通图的所有最小生成树上。假如最大权值为无限大&#xff0c;则输出-1。 题解&#xff1a; 先求出图的一…

牛客网 【每日一题】[SCOI2009]粉刷匠

链接&#xff1a; 题目描述 windy有 N 条木板需要被粉刷。 每条木板被分为 M 个格子。 每个格子要被刷成红色或蓝色。 windy每次粉刷&#xff0c;只能选择一条木板上一段连续的格子&#xff0c;然后涂上一种颜色。 每个格子最多只能被粉刷一次。 如果windy只能粉刷 T 次&#…

CF932E-Team Work【斯特林数,组合数学】

正题 题目链接:https://www.luogu.com.cn/problem/CF932E 题目大意 给出n,kn,kn,k&#xff0c;求∑i1nC(n,i)∗ik\sum_{i1}^nC(n,i)*i^ki1∑n​C(n,i)∗ik 解题思路 上式子的话&#xff0c;大体是先拆开iki^kik变成∑i1n(ni)∑j0k{kj}(ij)j!\sum_{i1}^n\binom{n}{i}\sum_{j0…

【数学】异或

异或 题目大意 问你不小于nnn的数对(a,b)(a,b)(a,b)&#xff0c;有多少个满足gcd(a,b)a⊕bgcd(a,b)a \oplus bgcd(a,b)a⊕b 输入样例#1 12输出样例#1 8输入样例#2 123456输出样例#2 214394数据范围 测试点数据规模110210031000450005100006100000750000081000000950000…

分布式事务解决方案以及 .Net Core 下的实现(上)

数据一致性是构建业务系统需要考虑的重要问题 &#xff0c; 以往我们是依靠数据库来保证数据的一致性。但是在微服务架构以及分布式环境下实现数据一致性是一个很有挑战的的问题。最近在研究分布式事物&#xff0c;分布式的解决方案有很多解决方案&#xff0c;也让我在研究的同…

[AGC014D] Black and White Tree(树形DP,博弈)

每次找到所有叶子节点&#xff0c;把它们的父亲染白&#xff0c;自己染黑。这个时候染完的叶子节点及其父亲节点对树的其他部分已无影响 ,可以直接删掉。 那么只需要判断树的其他部分是否有先手必胜策略即可。用递归遍历。 边界条件&#xff1a;若树为单一节点先手必胜。 代…

【每日一题】5月7日题目精讲 「火」皇家烈焰

链接&#xff1a; 「火」皇家烈焰 文章目录题目描述题解&#xff1a;代码&#xff1a;时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld题目描述 帕秋莉掌握了一种火属性魔法 由于钟爱扫…

【最小生成树】灌水

灌水 题目大意 给你n个点&#xff0c;你可以在某个点建水库&#xff08;生产水&#xff09;&#xff0c;或从其他有水的点建水管送过来 现在问你让所有点都有水的最小代价是多少 输入样例 4 5 4 4 3 0 2 2 2 2 0 3 3 2 3 0 4 2 3 4 0输出样例 9样例解释 FarmerJohnFarmer …

P6257-[ICPC2019 WF]First of Her Name【AC自动机】

正题 题目链接:https://www.luogu.com.cn/problem/P6257 题目大意 给出一个字典树&#xff0c;kkk次询问求每个节点出发到根节点的路径有多少包含前缀sis_isi​。 解题思路 我们按照所有询问串的反串构造ACACAC自动机。 那么此时如果我们用一个串SSS上去跑匹配的话&#xf…

微软MVP张善友告诉你,微服务选型要注意这些地方

周六的下午&#xff0c;广州周大福金融中心的写字楼静悄悄的&#xff0c;53楼的实盈多功能会议室却异常火爆&#xff0c;热闹非凡。来自广州各大科技公司的技术小伙伴们齐聚一堂&#xff0c;他们都在期待着一个人&#xff0c;那就是——微软MVP张善友和他带来的 .NET Core 微服…

像鱼

链接&#xff1a; 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld题目描述 给你一个边长为 n 的用硬币摆成的实心三角形&#xff0c;请问把他倒过来最少需要多少步&#xff1f; 例子…

[ZJOI2005]午餐(贪心+dp)

首先若只有一个窗口&#xff0c;利用贪心&#xff0c;按吃饭时间从大到小排序即可 正确性证明&#xff1a; 定义 eat[i] 第i个人的吃饭时间&#xff0c;time[i] 第i个人的打饭时间 延长时间T[i]max(eat[i]- ∑ji1ntimej\sum\limits_{ji1}^ntime_jji1∑n​timej​ ,0) 最后…

【图论】【模板】静态仙人掌(luogu 5236)

【模板】静态仙人掌 题目大意 给你一个无向仙人掌图&#xff08;保证每条边至多出现在一个简单回路中的无向图&#xff09;&#xff0c;问你两个点之间的最短路距离 输入样例#1 9 10 2 1 2 1 1 4 1 3 4 1 2 3 1 3 7 1 7 8 2 7 9 2 1 5 3 1 6 4 5 6 1 1 9 5 7输出样例#1 5 …

Wannafly挑战赛24D-无限手套【dp,生成函数】

正题 题目链接:https://ac.nowcoder.com/acm/contest/186/D 题目大意 mmm个二元组(ai,bi)(a_i,b_i)(ai​,bi​)&#xff0c;对于一个序列xxx的贡献是∏i1n(aixi2bixi1)\prod_{i1}^n(a_ix_i^2b_ix_i1)i1∏n​(ai​xi2​bi​xi​1) qqq次询问给出nnn求在xi≥0x_i\geq 0xi​≥0且…

SCF: 简单配置门面

Simple Configuration Facade, 简写为 SCF。是 代码 和 外部配置 (properties文件, 环境变量&#xff0c;系统/命令行参数, yaml文件, 等等)之间的一层抽象. 命名上和另一个著名组件slf4j (Simple Logging Facade for Java)相似, 在配置领域的地位也和slf4j &#xff08;.NET可…

字符串(AC自动机(fail tree))

传送门 注意&#xff1a;注释中的那段代码是不能用的 #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<queue> using namespace std; typedef long long ll; const int N2000010; struct Edge{int v,nxt;}ed…

武汉工程大学2020GPLT选拔赛(上)

比赛链接 A L1-1 I LOVE WIT 模拟&#xff0c;每个字母单独一行&#xff0c;前面的空格按规律输出。可以直接输出&#xff0c;也可以模拟过程 #include<bits/stdc.h> using namespace std; int main(){string s"I LOVE WIT";for(int i0;i<s.size();i){fo…

【矩阵乘法】【倍增】美食家(luogu 6772)

美食家 题目大意 给你一个有向图&#xff0c;边权为经过所需时间 每个点有一个点权&#xff0c;有些点还有有特殊的点权 当你到达一个点后&#xff0c;可以获得该点的点权&#xff08;重复经过可以重复获得&#xff0c;但不能停留&#xff09;&#xff0c;若在某个时间到某个…