乙隻兔子對於樹鏈剖分的理解

2021-07-12 06:39:22 字數 1420 閱讀 5890

某個早上,乙隻兔子沿一條不規則的曲線衝過來,問了另乙隻兔子這個問題。

這只兔子當場開始轉圈(這是它的一種癖好)。

兔子新的一天開始了…

樹鏈剖分?什麼鬼?

不太懂的小兔子向老兔子(場外觀眾)求援了。

「咳咳,顧名思義,樹鏈剖分嘛,就是把樹剖分成鏈……」

「這不廢話嗎?」

「……剖分成若干條鏈,然後把每條鏈扔進資料結構裡維護……」

「等等樹鏈剖分是幹嗎的?」

「……以解決如把一棵樹上同時增減節點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)

}

樹鏈剖分的學習理解

前言 本文僅為本人學習樹鏈剖分的理解和總結,有誤之處請大佬指點迷津。也有與其他部落格不同或矛盾之處。樹鏈剖分 顧名思義,將樹結構,剖分成鏈狀結構,然後將一條條的鏈拼接成線性結構,然後就可以通過線段樹 樹狀陣列等維護了。說白了就是在樹上,有些值不好維護,通過樹鏈剖分轉化成乙個序列,而序列就好維護了。樹...

乙隻兔子在公司的遭遇

第一家公司 老闆 兔兔,今天工作忙不忙?兔兔 不忙。下班時老闆對兔兔說 你明天不用來了。兔兔 為什麼?老闆 因為你不能多為公司幹事,所以才會不忙,公司要你何用?第二家公司 老闆 兔兔,今天工作忙不忙?兔兔 很忙。下班時老闆對兔兔說 你明天不用來了。兔兔 為什麼?老闆 因為你做事沒有條理性,所以才會整...

乙隻兔子在公司的遭遇

乙隻兔子在公司的遭遇 第一家公司 老闆 兔兔,今天工作忙不忙?兔兔 不忙。下班時老闆對兔兔說 你明天不用來了。兔兔 為什麼?老闆 因為你不能多為公司幹事,所以才會不忙,公司要你何用?第二家公司 老闆 兔兔,今天工作忙不忙?兔兔 很忙。下班時老闆對兔兔說 你明天不用來了。兔兔 為什麼?老闆 因為你做事...