瀟爺的講解。。十分的nice,可惜人傻。。。然而yveh似乎很早就a過一道題。。。。現在開始學。。。
樹鏈剖分就是茲辭把一棵樹上的資訊,切成多條鏈,再把這些鏈hash到某資料上,是之茲辭對原樹上的資訊進行快速的查詢與修改。
把樹上的路徑分類為重鏈和輕鏈
ps此處為鏈剖線段樹qwq
定義:**重兒子:**siz[u]為v的子節點中siz值最大的,那麼u就是v的重兒子。
輕兒子:v的其它子節點。
重邊:點v與其重兒子的連邊。
輕邊:點v與其輕兒子的連邊。
重鏈:由重邊連成的路徑。
輕鏈:輕邊。
剖分後的樹有如下性質:
性質1:如果(v,u)為輕邊,則siz[u] * 2 < siz[v];
性質2:從根到某一點的路徑上輕鏈、重鏈的個數都不大於logn。
預處理:(dfs_1 && dfs_2)
dfs_1:
求出樹上每個節點的深度deep[i],根的子樹大小size[i],祖先的資訊fa[i].以及son[i]之類的資訊.
dfs_2:
⒉對於v的各個輕兒子u,顯然有top[u] = u,並且w[u] = totw+1,進行dfs_2過程。
這就求出了top和w。
具體**:
void dfs_1(int
now,int f,int d)
}
void dfs_2(int
now,int number)
}
修改:
1.點修改 :根據編號在資料結構中修改
2.區間修改:(1)若l,r在一條重鏈上,直接修改loc[l]-loc[r]
(2)若l,r不在一條重鏈,一邊進行修改,一邊同時向上靠,靠的同一條重鏈上,變為情況(1)
查詢操作同上…
鏈剖線段樹模板題:(不穩定傳送門)
樹鏈剖分學習筆記
寫 又犯了很sb的錯誤,線段樹寫錯了。好像每次都會把r l 1寫成l r 1,然後就只有20分。寫的比較醜,壓了壓之後190行。基本上是我打過的最長的乙個模板了 然後簡單介紹一下樹剖吧。樹鏈剖分,就是把樹剖分成鏈,然後用資料結構來維護這些鏈,使得詢問 修改的複雜度達到o logn o l ogn 不...
樹鏈剖分學習筆記
樹鏈剖分 mod estc oder modestcoder modest code r如果你是重兒子,你就在重路徑上。如果你是輕兒子,暴力沿著祖先向上爬最多log nlogn logn 次就可以遇到重路徑。或者到根 而樹上操作基本就是找祖先 也許有人喜歡我的碼風 include include d...
樹鏈剖分學習筆記
前言 書上只講了重鏈剖分,菜雞也只會這一種,想看其他的是別想了。要會樹鏈剖分,首先你需要了解一些概念。我們把乙個節點的所有兒子節點中子樹節點數最大的稱為重兒子,也就是size最大的子節點。size的定義我在講換根dp時說過,因此不再贅述。對於每個節點的重兒子,我們用 son x 來記錄它,父親節點到...