【浙江集訓】wander

題目描述

給出一棵包含n 個點的森林。問按照以下規則行走,從u 走到v 的期望步數是多少。

行走的僞代碼如下:

count = 0

bool DFS( x, fa )
    if ( x==v ) return 1
    random_shuffle(e[x])
    for each y in e[x]   // which means that all the order of has the same possibility to be chosen
        ++count
        if ( DFS( y, x ) ) return 1
    ++count
    return -1

DFS( u, -1 )

要求實現Q 個操作,包括以下三種

  • xy 之間修建一條道路,若此前xy 之間有路徑相連則無視此次操作
  • xy 之間存在一條直接相連的道路,則去掉之
  • 詢問從u 走到v 的期望步數

n105,Q2×105


分析

首先分析一下要求的期望步數是個什麼東西。
讀懂僞代碼後發現它實際上是一個按照隨機順序遍歷這棵樹,直到遇到終點。
假如我們某一步走了岔路,那麼顯然要遍歷完這條岔路對應的整一棵子樹。那麼在每一個點上我們只關注終點所在子樹,以及它之前遍歷的有哪一些子樹。
不妨記E(x) 表示從x 走到v 的期望,當前所在的點爲x ,遍歷的順序爲p0,p2,,pm ,終點所在子樹的根是y ,排在第k 位,sizex¯¯¯¯¯¯¯¯ 表示除通往y 的那棵子樹,其它子樹大小的平均數,於是

E(x)=mk=0(P,pk=yk1i=0sizepi+E(pk)+1)(m+1)!=mk=0P,pk=yk1i=02sizepi(m+1)!+E(y)+1
E(v)=0

從總體來看,E(y)+1 這一項在E(u) 中總共就恰好是uv 的路徑長度。

注意這一項

mk=0P,pk=yk1i=02sizepi(m+1)!=mk=0P,pk=yk1i=02sizepim!m+1=mk=0k1i=02sizepik!pk+1pm1(mk)!m+1=mk=0k1i=02sizepik!m+1

由於這裏取遍所有的滿足pk 爲通往終點的點的可能的順序,觀察一下

  • k=0 時,分子爲0
  • k=1 時,分子爲2sizex¯¯¯¯¯¯¯¯
  • k=2 時,分子爲4sizex¯¯¯¯¯¯¯¯
  • k=m 時,分子爲2msizex¯¯¯¯¯¯¯¯

於是這一項實際上是

m(m+1)sizex¯¯¯¯¯¯m+1=zysizez

總的那一項,實際上就是以u 爲根的樹,減去v 爲根的子樹大小。

所以我們需要維護的東西就很明確了

  • 子樹大小
  • 連通性
  • 支持動態加或刪邊

用LCT可以輕鬆解決後兩個問題。
但是LCT怎麼維護子樹大小呢?
不妨記linkx 表示當前形態的這棵樹x 代表的重鏈,最高的一個點的子樹大小(注意這裏要是指包括它本身和splay樹的兒子所形成的一段重鏈)。extrax 表示x 的所有虛邊連出的點它們的子樹大小和。那麼

  • access 時,有可能將一個虛兒子變成重兒子,此時需要對extralink 做出一些調整
  • splay 時需要對extra 做出一些調整
  • 加邊時需要對extra 做出一些調整
  • 刪邊時需要對link 做出一些調整

剩下任意的操作都不會對extralink 造成影響。
於是子樹大小求出來了,剩下的就是LCT的常規維護了。

時間複雜度O(nlogn)
空間複雜度O(n)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章