1. 程式人生 > >BJ模擬:隨機遊走(樹型期望DP)

BJ模擬:隨機遊走(樹型期望DP)

傳送門

題解:
好題。又是一種經典模型。

先假設沒有終止節點。
fi表示ifai的期望步數,gi表示faii的期望步數。

我們發現:每次詢問兩點,ulcafi,vlcagi不會失效(可以想想為什麼)。 然後處理出這兩個陣列就直接鏈查詢了。

處理就非常Naive了,按照以前的套路,可以推得:
fi=degi+jfaifj
gi=degfai+ji,jfafaifj+gfai

O(n)DP即可。

#include <bits/stdc++.h>
using namespace std; typedef long long LL; typedef long double LD; const int RLEN=1<<18|1; inline char nc() { static char ibuf[RLEN],*ib,*ob; (ib==ob) && (ob=(ib=ibuf)+fread(ibuf,1,RLEN,stdin)); return (ib==ob) ? -1 : *ib++; } inline int rd() { char ch=nc(); int i=0,f=1
; while(!isdigit(ch)) {if(ch=='-')f=-1; ch=nc();} while(isdigit(ch)) {i=(i<<1)+(i<<3)+ch-'0'; ch=nc();} return i*f; } inline void W(LL x) { static int buf[50]; if(!x) {putchar('0'); return;} if(x<0) {putchar('-'); x=-x;} while(x) {buf[++buf[0]]=x%10; x/=10;} while
(buf[0]) putchar(buf[buf[0]--]+'0'); } const int N=1e5+50; int n,src,des; vector <int> edge[N]; int deg[N], sze[N], son[N], top[N], fa[N], dep[N]; LL f[N], g[N], sf[N], sg[N]; inline void dfs(int x,int ff) { sze[x]=1; fa[x]=ff; dep[x]=dep[ff]+1; if(x!=1 && deg[x]==1) return (void)(f[x]=1); LL sum=0; for(auto v:edge[x]) { if(v==ff) continue; dfs(v,x); sum+=f[v]; sze[x]+=sze[v]; son[x]=(sze[son[x]] < sze[v]) ? v : son[x]; } f[x]=deg[x]+sum; } inline void dfs2(int x,int ff) { LL sum=0; sum+=g[x]; for(auto v:edge[x]) if(v!=ff) sum+=f[v]; for(auto v:edge[x]) if(v!=ff) g[v]=deg[x]+sum-f[v]; for(auto v:edge[x]) if(v!=ff) dfs2(v,x); } inline void dfs3(int x,int ff) { sf[x]=sf[ff]+f[x]; sg[x]=sg[ff]+g[x]; for(auto v:edge[x]) { if(v==ff) continue; top[v]=(v==son[x]) ? top[x] : v; dfs3(v,x); } } inline int lca(int x,int y) { while(top[x]!=top[y]) { (dep[top[x]] > dep[top[y]]) ? (x=fa[top[x]]) : (y=fa[top[y]]); } return (dep[x]>dep[y]) ? y : x; } int main() { n=rd(); for(int i=1;i<n;i++) { int x=rd(), y=rd(); edge[x].push_back(y); edge[y].push_back(x); ++deg[x]; ++deg[y]; } dfs(1,0); dfs2(1,0); top[1]=1; dfs3(1,0); for(int q=rd();q;q--) { int u=rd(), v=rd(), l=lca(u,v); W((sf[u]-sf[l]+sg[v]-sg[l])); putchar('\n'); } }

相關推薦

BJ模擬隨機期望DP

傳送門 題解: 好題。又是一種經典模型。 先假設沒有終止節點。 記fifi表示ii到faifai的期望步數,gigi表示faifai到ii的期望步數。 我們發現:每次詢問兩點,uu到lcalca的fifi,vv到lcalca的gigi不會失效(可以想想

loj#2542. 「PKUWC2018」隨機(MinMax容斥 期望dp)

題意 題目連結 Sol 考慮直接對詢問的集合做MinMax容斥 設\(f[i][sta]\)表示從\(i\)到集合\(sta\)中任意一點的最小期望步數 按照樹上高斯消元的套路,我們可以把轉移寫成\(f[x] = a_x f[fa] + b_x\)的形式 然後直接推就可以了 更詳細的題解 #i

LOJ2542 PKUWC2018隨機概率期望+容斥原理

  如果直接dp,狀態裡肯定要帶上已走過的點的集合,感覺上不太好做。   考慮一種對期望的minmax容斥:其中Max(S)為遍歷完S集合的期望步數,Min(S)為遍歷到S集合中一個點的期望步數。當然才不管怎麼證,反正看上去非常優美。   設f[i][S]為由i節點出發的Min(S),顯然有f[i][S]

【LOJ#2542】[PKUWC2018]隨機min-max容斥,動態規劃

【LOJ#2542】[PKUWC2018]隨機遊走(min-max容斥,動態規劃) 題面 LOJ 題解 很明顯,要求的東西可以很容易的進行\(min-max\)容斥,那麼轉為求集合的\(min\)。 那麼怎麼求解每個集合的\(min\)呢。 顯然以起點為根節點,如果點集中一個點在另外一個點的子樹內,顯

推薦演算法基於圖的演算法隨機

ItemRank @@@Random-walk computation of similarities between nodes of a graph,with application tp collaborative recommendations

[PKUWC2018]隨機(MinMax容斥+樹形DP)

print scanf 直接 style 困難 printf b+ stdout -s MinMax容斥將問題轉化為求x到S中任意點的最小時間。 樹形DP,直接求概率比較困難,考慮只求系數。最後由於x節點作為樹根無父親,所以求出的第二個系數就是答案。 https://b

【UVA】536 Tree Recovery結構基礎

cnblogs using include http tree c++ code div str 題目 題目 ? ? 分析 莫名A了 ? ? 代碼 #include <bits/stdc++.h> using namespace std; string s1

CodeForces - 321ECiel and Gondolas 四邊形不等式優化DP

題意:N個人排成一行,分成K組,要求每組的不和諧值之和最小。 思路:開始以為是斜率優化DP,但是每個區間的值其實已經知道了,即是沒有和下標有關的未知數了,所以沒必要用斜率。 四邊形優化。 dp[i][j]表示前j個人分為i組的最小代價。 #include<bits/stdc++.h>

ICPC2017網路賽南寧子序列最大權值狀陣列+dp

Let SS be a sequence of integers s_{1}s ​1 ​​ , s_{2}s ​2 ​​ , ......, s_{n}s ​n ​​ Each integer is is associated with a weight by the f

BZOJ1076獎勵關狀壓期望dp

fsg bzoj1076 get ctx oda x86 store vbo shu jzp訊廄62跋hx6http://t.docin.com/sina_6341946983 V順撞濁z衫X詵徽2撈4http://jz.docin.com/dtfv76012 a0

【題解】 bzoj1076: [SCOI2008]獎勵關 裝壓+期望dp

狀態 span 方程 con can i+1 std tin log 題面戳我 Solution 並不會做,看了下題解大概了解了。期望這個東西好難搞啊qwq 我們定義\(dp[i][j]\)表示第\(i\)步,拿到寶物前的狀態為\(j\)。 正著來會有很多不合法的情況,剔

【BZOJ3925】[ZJOI2015] 地震後的幻想鄉狀壓期望DP

點此看題面 大致題意: 有\(n\)個點和\(m\)條邊,每條邊的權值是一個\(0\sim1\)的隨機實數,要你用\(n-1\)條邊將圖聯通,問這\(n-1\)條邊中邊權最大值的期望最小值。 提示 這題應該是一道比較難的\(DP\)題吧。 首先,我們需要注意到提示中的一句話: \(Hint

codeforces 148D. Bag of mice 概率與期望DP

The dragon and the princess are arguing about what to do on the New Year's Eve. The dragon suggests flying to the mountains to watch fairies dancing in t

BZOJ 1076 獎勵關 狀壓期望dp

1076: [SCOI2008]獎勵關 Time Limit: 10 Sec Memory Limit: 128 MB Description   你正在玩你最喜歡的電子遊戲,並且剛剛進入一個獎勵關。在這個獎勵關裡,系統將依次隨機丟擲k次寶物, 每次你

BJ模擬 隨機期望dp+倍增】

題目描述 給定一棵n個節點的樹,一個人在樹上隨機遊走,即從一個點等概率走到相鄰的一個點,m組詢問,問從x走到y的期望。 n≤100000n≤100000 解題思路: 樹上概率期望一般設兩個值,一個從自己到父親,一個從父親到自己。 設fifi表示從ii走

重啟隨機演算法RWR

重啟隨機遊走演算法(Random Walk with Restart) 1 pagerank演算法的基本原理 Pagerank演算法是Google的網頁排名演算法,由拉里佩奇發明。其基本思想是民主表

jzoj3657 [NOI2014模擬]隨機

Description 在一個二維平面上每次隨意往四周一個方向上行走的模型叫隨機遊走。現在對這個模型進行一些修改:有一個n*m的矩陣,你初始站在(1,1),想要走到(n,m),每次隨機往四周不超出矩形方向走一步,問走到(n,m)的期望步數。 Solu

推薦系統之基於圖的推薦基於隨機的PersonalRank演算法

一 基本概念 基於圖的模型是推薦系統中相當重要的一種方法,以下內容的基本思想是將使用者行為資料表示為一系列的二元組,每一個二元組(u,i)代表使用者u對物品i產生過行為,這樣便可以將這個資料集表示為一個二分圖。 假設我們有以下的資料集,只考慮使用者喜不喜歡該物品而不考慮使用

bzoj3143: [Hnoi2013]貪心+高斯消元

last fin con ont fab ios const 技術 opened   考慮讓總期望最小,那麽就是期望經過次數越多的邊貪心地給它越小的編號。   怎麽求每條邊的期望經過次數呢?邊不大好算,我們考慮計算每個點的期望經過次數f[x],那麽一條邊的期望經過次數就是

ADF檢驗判斷股價是否隨機

style 上下 nco stat sed utf-8 logs sin .com 從tushare上下載‘002337‘的數據 import tushare as ts data = ts.get_h_data(‘002337‘) data.to_csv(‘e:/st