[模板] 虛樹

來源:互聯網
上載者:User

標籤:直接   說明   memset   第一個   需要   dfs序   之間   暴力   清空   

目的

解決樹上多組關於某些點的詢問,複雜度是關於每次詢問點的個數的和的

思路

把每次詢問的點和某些lca(即關鍵點)濃縮到虛樹上,兩點之間的連邊包含原樹中兩點間路徑的資訊,再在虛樹上暴力(?)處理

做法

先按照dfs序排序,這樣可以保證做到不在某點子樹中的點時,它的子樹中的點都已經做完了

用一個棧來記錄從虛樹根到當前做到的點的鏈。雖然樹根是誰都行,但方便起見直接給成1,並把1和第一個點壓入棧中

現在新加入一個點p,設棧頂元素是x,p和x的最近公用祖先是lca

有兩種情況(lca絕對不會等於p來著,因為是按dfs序做的):

1.lca=x,直接把p壓入棧中

2.lca!=x

  這說明lca在x的上面,而且x的子樹已經做完了,我們要在棧中找到一個合適的位置把lca放下來,再把x連到一個合適的點上,再把x踢掉,再把p加進去

  迴圈地來做,設棧頂下面的元素是y,如果:

    1.dfn[y]>dfn[lca],即lca在y上面,那給y和x連邊,然後踢了x繼續做

    2.dfn[y]=dfn[lca],那麼lca已經在虛樹中有了,給y和x連邊,踢了x然後break就行了

    3.dfn[y]<dfn[lca],說明lca在y下面,那就要給y,x連邊,踢了x以後把lca壓進去,再break

  最後把p也壓到棧裡。注意連邊的時候把路徑資訊也記到邊上

然後在建出的虛樹上亂搞就可以了。注意由於詢問數很多,萬萬不可memset,需要清空什麼東西的時候怎麼加進來就怎麼減回去好了。清空虛樹的邊的話可以dfs一下

例題以後再補

[模板] 虛樹

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.