CF1528C dfs序+set维护
傳送門(mén)
文章目錄
- 題意:
- 思路:
題意:
給你兩棵有nnn個(gè)節(jié)點(diǎn)的樹(shù),我門(mén)記第一棵為aaa,第二棵為bbb,現(xiàn)在你有一個(gè)nnn個(gè)點(diǎn)都孤立的點(diǎn)集,兩個(gè)點(diǎn)u,vu,vu,v可以連邊當(dāng)且僅當(dāng)這兩個(gè)點(diǎn)在aaa樹(shù)中一個(gè)是另一個(gè)的祖先節(jié)點(diǎn)且在bbb樹(shù)中每個(gè)都不是另一個(gè)的祖先節(jié)點(diǎn),讓你求連完邊之后的最大聯(lián)通塊的大小是多少。
兩棵樹(shù)都以111為根。
n≤3e5n\le 3e5n≤3e5
思路:
首先我們知道答案選的點(diǎn)一定是aaa樹(shù)中從根節(jié)點(diǎn)到葉子節(jié)點(diǎn)的路徑上點(diǎn)的一個(gè)子集,這啟發(fā)我們可以從aaa樹(shù)的根開(kāi)始向下dfsdfsdfs,維護(hù)走過(guò)的點(diǎn),現(xiàn)在我們的問(wèn)題就是如何從我們維護(hù)的點(diǎn)中選出一個(gè)最大的點(diǎn)集使其在bbb樹(shù)中都是符合條件的。
在bbb樹(shù)中選出來(lái)的每?jī)蓚€(gè)點(diǎn)都不互為祖先,那么他們倆一定在一棵子樹(shù)內(nèi),涉及子樹(shù)問(wèn)題我們可以將其轉(zhuǎn)換成dfsdfsdfs序。
首先需要了解dfsdfsdfs序的性質(zhì),dfsdfsdfs序?qū)⒚總€(gè)子樹(shù)劃分為了若干區(qū)間,也就是每個(gè)子樹(shù)的根有一個(gè)區(qū)間[l,r][l,r][l,r],且劃分的若干區(qū)間只會(huì)有兩種情況:一個(gè)區(qū)間完全包含另一個(gè)區(qū)間,兩個(gè)區(qū)間完全不相交。
現(xiàn)在我們對(duì)bbb樹(shù)求一個(gè)dfsdfsdfs序,現(xiàn)在每個(gè)點(diǎn)都轉(zhuǎn)換成一個(gè)區(qū)間了,對(duì)aaa來(lái)說(shuō)我們只需要需要維護(hù)一個(gè)從根到當(dāng)前點(diǎn)的若干個(gè)不相交線段,可以分以下兩個(gè)情況:
(1)(1)(1)如果我們當(dāng)前插入的點(diǎn)uuu的區(qū)間[lu,ru][l_u,r_u][lu?,ru?]包含了之前插入的區(qū)間,那么我們肯定是舍棄這個(gè)點(diǎn)是更優(yōu)的。
(2)(2)(2)如果我們當(dāng)前插入的點(diǎn)在前面已經(jīng)有的點(diǎn)的區(qū)間內(nèi)的話,那么肯定是將前面大區(qū)間刪掉,加入當(dāng)前區(qū)間是更優(yōu)的。
以上操作可以用setsetset維護(hù)一下in[u]in[u]in[u],讓后lowerboundlower_boundlowerb?ound找離他最近的點(diǎn)的in[v]in[v]in[v],判斷一下就好啦,第二種情況同理,只需要讓it??it--it??即可,具體的看代碼比較好懂。
復(fù)雜度O(nlogn)O(nlogn)O(nlogn)。
Update:Update:Update:
由于題目保證了ai<ia_i<iai?<i,那么說(shuō)明標(biāo)號(hào)一定是遞增的,所以不會(huì)出現(xiàn)當(dāng)前區(qū)間是大區(qū)間,之前有小區(qū)間的情況,所以it==s.end()∣∣?it>out[u]it==s.end()||*it>out[u]it==s.end()∣∣?it>out[u]這個(gè)判斷條件可以直接去掉。
總結(jié)
以上是生活随笔為你收集整理的CF1528C dfs序+set维护的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 无花果叶泡酒治疗白斑吗
- 下一篇: 女人吃三七粉可以祛斑吗