虛樹學習筆記


虛樹聽起來還是很牛逼的,,,,但是嘗試學一下之后發現其實並麻油很難,,,,至少基本的操作還是比較簡單的(雖然題目對我來說都還是比較難的QAQ

它可以理解為一棵樹的壓縮版,就是假如選取一部分點集,此時很多節點都是無用的,但是在做的時候又會做到,復雜度就不對,這個時候就考慮建一棵虛樹——也就是重新建一棵樹,只保留有用的點(給定的點集&他們的lca

圖就不放辣不喜歡畫圖QAQ在網上搜題解應該基本上都有圖的趴QAQ

然后說下虛樹的性質,建立,常見應用,以及經典題目,就差不多辣QAQ

虛樹の性質

m個給定節點形成的虛樹的節點不超過2m-1

簡要證明:

由虛樹的性質可得,如果一個節點不是給定節點,它只能是lca,所以任意一個非給定節點都必定有至少2個節點,所以節點數不超過2m-1

所以虛樹的單次復雜度都是O(size)的

所以虛樹通常用來解決多次詢問給定不同點集且點集總量比較小的問題w

虛樹の建立

有兩種,分別說下w

第一種是維護最右鏈,其實就是說維護一個棧,保證棧中的元素在一條鏈上

具體來說就首先dfs求出dfn什么的基本屬性不說

然后每加入一個點x,算出x和當前棧的棧頂y的lca,然后判斷

首先如果lca=y,說明依然在這條鏈上,將x壓入棧就好

然后如果lca!=y,就一定是y比lca還要深一些,就是x在另一條鏈上

因為我們首先是按照dfn的性質給點排了序的,所以由性質可得,直接把棧中深度大於lca的點都彈出去,然后加入lca和x就可以辣

然后其實還是比較好理解的,,,尤其結合圖像簡直一目了然,所以可以自己畫一下所以推薦一下psj的學習筆記,,,配了圖然后講得也極好QAQ

il void build()
{
    head_stck=cnt_edge_fk=0;
    rp(i,1,cnt_ld)
    {
        if(!head_stck)stck[++head_stck]=land[i];
        else
        {
            ll grd=lca(stck[head_stck],land[i]);if(grd==stck[head_stck]){stck[++head_stck]=land[i];continue;}
            while(dep[stck[head_stck-1]]>dep[grd])ad_fk(stck[head_stck-1],stck[head_stck]),--head_stck;
            if(grd!=stck[head_stck-1])ad_fk(grd,stck[head_stck]),stck[head_stck]=grd,stck[++head_stck]=land[i];
            else ad_fk(grd,stck[head_stck]),stck[head_stck]=land[i];
        }
    }
    while(head_stck>1)ad_fk(stck[head_stck-1],stck[head_stck]),--head_stck;rt=stck[head_stck];
}
具體實現代碼w

第二種比較簡單粗暴,就根據dfn序的性質,直接把點集按dfn排序,然后兩兩點的lca算出來,把lca和點全部加入虛樹,記得去重就是辣

這兒就很顯然嘛,首先可以想到,正解方法得到的子樹一定是這個方法的子樹的子集

所以只是買有壓縮完全的問題,首先不會影響正確性這個很顯然

然后再加上這么做的復雜度顯然是對的(只是常數怕是有點大,,,?

所以這么做不管是正確性還是復雜度都過得去,就麻油問題辣

優點大概在於很簡單很容易打完,而且復雜度是一樣的w

il void build_fk()
{
    sort(land+1,land+1+ld_cnt,cmp);
    my(i,ld_cnt,2)land[++ld_cnt]=lca(land[i],land[i-1]);land[++ld_cnt]=1;
    sort(land+1,land+1+ld_cnt,cmp);ld_cnt=unique(land+1,land+1+ld_cnt)-land-1;
    rp(i,1,ld_cnt)
    {
        while(head_stck && dep[stck[head_stck]]>dep[land[i]])--head_stck;
        ad_fk(stck[head_stck],land[i],dep[land[i]]-dep[stck[head_stck]]);
        stck[++head_stck]=land[i];
    }
    return;
}
大概長這樣兒?不清楚有麻油打掛,,,有的話請指出昂QAQ

虛樹の應用

求實樹上任意一點到虛樹上的最短距離

就是世界樹那題,,,明天寫QAQ

虛樹の題目

明天寫QAQ先隨便寫幾個QAQ

[X]消耗戰

[X]世界樹

[X]大工程

[X]毒瘤

[ ]CF613D

[ ]戰略游戲 (還要會圓方樹+鏈並嚶嚶嚶

[ ]尋寶游戲 (同上QAQ

[ ]CF809E (還要會Mobius反演嚶嚶嚶

[ ]暴力寫掛 (還要會邊分治嚶嚶嚶

[ ]通道 (同上QAQ

[ ]CF613D


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM