1. 程式人生 > >樹鏈剖分的基本思想

樹鏈剖分的基本思想

一個 概念 span fat 基本 clas 同時 如果 i節點

一、樹鏈剖分的作用

  通常是求樹上u到v的路徑節點之和

  這個問題很容易可以想到設f[i]表示根節點到i節點的節點之和

  t=lca(u,v),然後可以把u->v劃分為u->t+t->v-t;

  則有結論:u->v=f[u]+f[v]-2*f[t]+t,這樣就可以求出來了

  但是加上u到v的路徑上的節點值的修改的話,就必須用樹鏈剖分了。。。

二、幾個概念:

  1.重兒子:一個節點的所有兒子中子樹最大的那一個(相同任意取一個)

  2.輕兒子:除了重兒子以外的所有其他兒子

  3.重邊:father連向重兒子的邊

  4.輕邊:除了重邊以外的邊

  5.重鏈:一條路徑,上面全部都是由重兒子構成(即全為重邊)

三、幾個推論:

  1.兩條重鏈之間必然有一些輕邊連接

  2.我們用一條重鏈的起始節點來表示一條重鏈(每個節點只會屬於一條重鏈)

  3.bel[x]表示x節點的重鏈的開頭節點

四、問題的解決:

  首先對於修改操作,將lca(u,v)求出,然後判斷bel[x]是否等於bel[y]

  1.如果等於,那就可以直接對一條重鏈上的節點進行修改

  2.如果不等於,那就把x和y同時跳到他們的重鏈的頂端,然後跨越輕邊,繼續剛才的過程

  其實上面的區間修改和區間查詢可以用線段樹來實現

樹鏈剖分的基本思想