某個早上,乙隻兔子沿一條不規則的曲線衝過來,問了另乙隻兔子這個問題。
這只兔子當場開始轉圈(這是它的一種癖好)。
兔子新的一天開始了…
樹鏈剖分?什麼鬼?
不太懂的小兔子向老兔子(場外觀眾)求援了。
「咳咳,顧名思義,樹鏈剖分嘛,就是把樹剖分成鏈……」
「這不廢話嗎?」
「……剖分成若干條鏈,然後把每條鏈扔進資料結構裡維護……」
「等等樹鏈剖分是幹嗎的?」
「……以解決如把一棵樹上同時增減節點x到節點y的權值之類的問題……」
「……」
(太給力了,你的回答完美的解決了我的問題?)(某熊亂入,驚散兔子)
樹鏈剖分有倆個東東
重邊 輕邊
重邊:比較重的那邊
輕邊:比較輕的那邊
嗯,老兔子喝了點伏特加(然而並不是廣告)(推)
size(x):以節點x為根的子樹的節點個數
重邊:節點x與其有最大的size值的那個兒子之間的邊
輕邊:除了重邊外的邊全是輕邊
「為什麼要這樣做?」
(老兔子爬起)「just for fun.啊,不是不是為為為為了使鏈的數目盡量少,省事。」(又自己摔倒)
「好像有道理…」
於是就有了這兩個性質
(1)輕邊(u,v)中,size(v)<=size(u)/2
(2)從根到某一點的路徑上,輕邊、重邊條數不超過log n。
重邊輕邊好分,不過怎麼連成鏈呢?
我們把重邊連起來:從根節點開始,沿著重邊往下找,拉成重鏈,不在這條重鏈上?那就從這個節點再往下拉一條。
以下是一些陣列
老兔子:」讓我翻出70年的雪碧,啊不是15年的**」
int point[max_n],size[max_n],top[max_n],ch[max_n];
int deep[max_n],tid[max_n],zrank[max_n],fa[max_n];
int head[max_n],to[2*max_n],znext[2*max_n],edge;//鏈式前向星
void zinit()
void add_edge(int u,int v)
void dfs1(int u,int pa,int d)
}}void dfs2(int u,int tp)
}
樹鏈剖分的學習理解
前言 本文僅為本人學習樹鏈剖分的理解和總結,有誤之處請大佬指點迷津。也有與其他部落格不同或矛盾之處。樹鏈剖分 顧名思義,將樹結構,剖分成鏈狀結構,然後將一條條的鏈拼接成線性結構,然後就可以通過線段樹 樹狀陣列等維護了。說白了就是在樹上,有些值不好維護,通過樹鏈剖分轉化成乙個序列,而序列就好維護了。樹...
乙隻兔子在公司的遭遇
第一家公司 老闆 兔兔,今天工作忙不忙?兔兔 不忙。下班時老闆對兔兔說 你明天不用來了。兔兔 為什麼?老闆 因為你不能多為公司幹事,所以才會不忙,公司要你何用?第二家公司 老闆 兔兔,今天工作忙不忙?兔兔 很忙。下班時老闆對兔兔說 你明天不用來了。兔兔 為什麼?老闆 因為你做事沒有條理性,所以才會整...
乙隻兔子在公司的遭遇
乙隻兔子在公司的遭遇 第一家公司 老闆 兔兔,今天工作忙不忙?兔兔 不忙。下班時老闆對兔兔說 你明天不用來了。兔兔 為什麼?老闆 因為你不能多為公司幹事,所以才會不忙,公司要你何用?第二家公司 老闆 兔兔,今天工作忙不忙?兔兔 很忙。下班時老闆對兔兔說 你明天不用來了。兔兔 為什麼?老闆 因為你做事...