日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/3 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【数学期望】【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.N?10.
對于 40%40\%40%的數據,N?1000.N \leqslant 1000.N?1000.
另有 20%20\%20%的數據, 保證給定的樹是一條鏈.
對于 100%100\%100%的數據, N?100000,Q?100000.N \leqslant 100000, Q \leqslant 100000.N?100000,Q?100000.

解題思路

樹上兩點之間的距離要先求lcalcalca,然后可以通過前綴和來得出兩點到lcalcalca距離
對于前綴和我們要先得出某個點到父親節點和兒子節點的期望距離
我們設
degxdeg_xdegx?為點xxx的度數
dp1xdp1_xdp1x?為點xxx到父親節點的期望距離
dp2xdp2_xdp2x?為點xxx的父親節點到點x的期望距離
我們先算dp1dp1dp1
葉子結點到父親節點的期望距離為1,因為只能往上
對于不是葉子結點的點xxx
它直接到父親節點的期望是1degx\frac{1}{deg_x}degx?1?1degx\frac{1}{deg_x}degx?1?的概率走這條邊)
他到子節點i再回來再到父親節點的期望是1+dp1i+dp1xdegx\frac{1+dp1_i+dp1_x}{deg_x}degx?1+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?=degx?1?+isonx??degx?1+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?=degx?1?+degx?degx??1?+degx?(degx??1)dp1x??+isonx??degx?dp1i??
移項
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}degx?dp1x?degx???degx?(degx??1)dp1x??=degx?1?+degx?degx??1?+isonx??degx?dp1i??
化簡
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}degx?dp1x??=degx?1?+degx?degx??1?+isonx??degx?dp1i??
同乘degxdeg_xdegx?
dp1x=degx+∑i∈sonxdp1idp1_x=deg_x+ \sum_{i\in son_x}dp1_idp1x?=degx?+isonx??dp1i?
求出dp1后我們來求dp2
父親節點直接到目標子節點的期望是1degfa\frac{1}{deg_{fa}}degfa?1?
父親節點先到父親節點的父親節點然后回來再到目標子節點的期望是1+dp2fa+dp2xdegfa\frac{1+dp2_{fa}+dp2_x}{deg_{fa}}degfa?1+dp2fa?+dp2x??
父親節點先到其他子節點再回來再到目標子節點的期望是1+dp1i+dp2xdegfa\frac{1+dp1_i+dp2_x}{deg_{fa}}degfa?1+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?=degfa?1?+degfa?1+dp2fa?+dp2x??+isonfa?i?=x?degfa?1+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?=degfa?1?+degfa?1+dp2fa??+degfadp2x??+degfa?degfa??2?+degfa?(degfa??2)dp2x??+isonfa?i?=x?degfa?dp1i??
移項
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}}degfadp2x?degfa???degfadp2x???degfa?(degfa??2)dp2x??=degfa?1?+degfa?1+dp2fa??+degfa?degfa??2?+isonfa?i?=x?degfa?dp1i??
合并
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??=degfa?1?+degfa?1+dp2fa??+degfa?degfa??2?+isonfa?i?=x?degfa?dp1i??
同乘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?+isonfa?i?=x?dp1i?
根據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?+isonfa?i?=x?dp1i??=degfa?+isonfa??dp1i??dp1x?=dp1fa??dp1x??dp2x?=dp2fa?+dp1fa??dp1x?
然后求前綴和,再求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; }

總結

以上是生活随笔為你收集整理的【数学期望】【LCA】【树形DP】树的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。