本文主要介紹袁方圓百度百科(袁方圓百科),下面一起看看袁方圓百度百科(袁方圓百科)相關(guān)資訊。
\(\text{0x00。}\)前言突然發(fā)現(xiàn)整個(gè)機(jī)房只有我一個(gè)人可以 我不知道方樹,最近方樹在模擬游戲中出現(xiàn)的次數(shù)多得驚人,所以我來學(xué)習(xí)一下。it 這不是因?yàn)槲夷堋?草,不要解決問題。
\(\text{0x01。}\)廣義平方樹在平方樹中定義,每個(gè)原點(diǎn)對(duì)應(yīng)一個(gè)點(diǎn),每個(gè)點(diǎn)對(duì)對(duì)應(yīng)一個(gè)正方形點(diǎn);對(duì)于每一個(gè)點(diǎn)雙連通分量,其對(duì)應(yīng)的正方形點(diǎn)連接到這個(gè)點(diǎn)雙連通分量中的每一個(gè)點(diǎn);正方形樹的每條邊連接一個(gè)點(diǎn)和一個(gè)正方形點(diǎn)。而如果一個(gè)點(diǎn)連接多個(gè)正方形的點(diǎn),那么這個(gè)點(diǎn)在原圖上的點(diǎn)就是這些點(diǎn)對(duì)之間的切點(diǎn)。需要注意的是,正方形樹的點(diǎn)數(shù)小于\(2n\),受點(diǎn)數(shù)的限制。
\(\text{oi-wiki}\)不應(yīng)掛斷(
構(gòu)造內(nèi)聯(lián)void添加ge (int u,int v) {e [u]。就位_后退(v),e [v]。launte _ back(u);}void tarjan(int u,int fa){ dfn[stk[tp]= u]= low[u]= idx;for(const auto v:e[u])if(v^fa){ if(!dfn[v]) {tarjan(v,u),low[u]=min(low[u],low[v]);if(low[v]=dfn[u]) {addedge( cnt,u);while(stk[tp]^v) addedge(cnt,stk[tp-]);addedge(cnt,stk[tp-]);}} else low[u] = min(low[u],dfn[v]);} }//留著孤兒沒意義??靵碜鲱}!例1。\(\text{[apio 2018]馬拉松}\)
題目描述:給一個(gè)無向圖,求\((s,c,f)\)三元組的個(gè)數(shù),分別代表從\(s\)出發(fā),經(jīng)過\(c\)到\(f\)(經(jīng)過點(diǎn)不能重復(fù))。
考慮當(dāng)(s,f)固定時(shí),有多少——滿足條件。實(shí)際上就是建立了平方樹之后\(s,f\)所屬的點(diǎn)對(duì)中的點(diǎn)。這從感性的角度來看其實(shí)是很有道理的??紤]一個(gè)點(diǎn)double \(b\)和它外面的一個(gè)點(diǎn)\(a\),那么就可以從\(b\)中的任意一點(diǎn)出發(fā),到\(a\)。法沒有經(jīng)過他去過的地方就回來了。
但是我們?nèi)绾斡?jì)算貢獻(xiàn)呢?將正方形點(diǎn)指定為它所代表的點(diǎn)對(duì)的大小,將點(diǎn)指定為\(-1\)。如何理解\(-1\)?或者看一張圖:
假設(shè)\(s=4,f=5\),我們可以發(fā)現(xiàn)\(1,2\)是由相鄰的平方點(diǎn)計(jì)算兩次,所以需要減去。因?yàn)槁窂降膬啥艘欢ㄊ屈c(diǎn),而且點(diǎn)是交錯(cuò)的,這個(gè)東西是對(duì)的。
現(xiàn)在問題其實(shí)變成了每個(gè)點(diǎn)會(huì)被路徑計(jì)算多少次,樹\(\mathtt{dp}\)就夠了。
例2。\ (\ text {cf487e tours} \)
題目描述:給定一個(gè)簡(jiǎn)單的無向連通圖,需要兩個(gè)操作:
修改點(diǎn)的點(diǎn)權(quán)重;求兩點(diǎn)間所有簡(jiǎn)單路徑上點(diǎn)權(quán)的最小值。利用上面的結(jié)論,可以直接維護(hù)一個(gè)方形點(diǎn)\(\text{multiset}\)來維護(hù)對(duì)應(yīng)的點(diǎn)對(duì),然后用樹截面來維護(hù)。
問題是當(dāng)多個(gè)點(diǎn)對(duì)中包含的切點(diǎn)被修改時(shí)(比如菊花圖),復(fù)雜度會(huì)直接上升。這里有一個(gè)經(jīng)典的\(\rm詭計(jì)\):方點(diǎn)不維持父點(diǎn)的權(quán)重,所以點(diǎn)只會(huì)修改自己的父點(diǎn)。顯然,只有當(dāng)\(\rm lca\)是方點(diǎn)時(shí),查詢才會(huì)出錯(cuò),所以可以補(bǔ)充父 s點(diǎn)正好在頂點(diǎn)。
例3。\(\text{[sdoi 2018] }\)策略游戲
題目描述:給出一個(gè)簡(jiǎn)單的無向連通圖。有\(zhòng)(q\)個(gè)查詢,每次給定一個(gè)點(diǎn)集\(s\),有多少個(gè)點(diǎn)\(u\)滿足\(u\notin s\)和刪除\(u\)后\(s\)中的點(diǎn)不都在一個(gè)連通分支中。
很容易發(fā)現(xiàn) \(s\)中的點(diǎn)不都在連通分量中等價(jià)于s中存在\(u,v\),使得\(u,v \)之間的所有簡(jiǎn)單路徑不連通。所以相對(duì)于\(u,v\),各自點(diǎn)對(duì)之間的點(diǎn)就是合法的切割點(diǎn),然后構(gòu)建一棵圓樹。
那么實(shí)際上就是計(jì)算樹上\(s\)的中點(diǎn)形成的最小連通塊中的點(diǎn)數(shù)。首先給出計(jì)算方法:預(yù)處理從根到每個(gè)點(diǎn)的點(diǎn)數(shù)\(\rm val\),按\(\rm dfs\)排序\(s\)。答案是
\ [-| s | [\ text {lca} (s _ 1,s _ { | s | })\ le n]\ frac { 1 } { 2 } \ cdot \ sum _ { i = 1 } { | s | } \ text { val } _{|s| 1}=s_1\)。
給出一個(gè)理解方法:在計(jì)算\(\rm val\)時(shí),我們把權(quán)重掛在\(u\)和父親這一邊,實(shí)際上是在模擬\(\rm dfs\)的過程。每一次相鄰點(diǎn)的匹配,實(shí)際上都是走出一個(gè)子樹,然后走進(jìn)一個(gè)子樹,最后從最后一個(gè)點(diǎn)走回第一個(gè)點(diǎn),然后以\(\text{lca}(s_1,s_{|s|})\)為根做一個(gè)\(\rm dfs\)!可以發(fā)現(xiàn)每個(gè)點(diǎn)會(huì)計(jì)算兩次。同時(shí)也可以發(fā)現(xiàn),我們還沒有計(jì)算出\(\text{lca}(s_1,s_{|s|})\)的貢獻(xiàn),所以要特別判斷一下。
例4。\(\text{chef and sad pairs}\)
用顏色來考慮這個(gè)問題:如果你建一棵正方形樹,由于點(diǎn)\(x\)而悲傷的對(duì)數(shù)相當(dāng)于在\(x\)(你不妨把你的父親想象成\(x\))的不同子樹中選擇一對(duì)點(diǎn)。但是這個(gè)\(\rm dfs\)的復(fù)雜度是平分的,所以需要建立一個(gè)虛擬樹來求解。
但是,仍然有一個(gè)問題:對(duì)于 祖先-后代amp關(guān)系(假設(shè)\(u,v\)是同一個(gè)顏色,兩者之間沒有其他顏色的點(diǎn)),這個(gè)顏色的統(tǒng)計(jì)沒有答案!所以你需要在鏈條上有所作為。好水。
讓 ■放一個(gè)代碼:\(\text{submission。}\)
此外,還可以進(jìn)行啟發(fā)式合并:\(\text{solution。}\)
\(\text{0x02。}\)窄圈樹的定義不是很清楚為什么要分類。
現(xiàn)在無向圖保證是仙人掌森林。仙人掌:每條邊至多屬于一個(gè)環(huán)的無向連通圖;可以發(fā)現(xiàn)此時(shí)每個(gè)點(diǎn)對(duì)對(duì)應(yīng)一個(gè)簡(jiǎn)單的環(huán),這樣仙人掌問題就可以轉(zhuǎn)化為基環(huán)樹上的問題解,就像這樣:構(gòu)造void tarjan (int u,int fa) {dfn [u] = low [u] = idx,stk[tp]= u;for(const auto v:g[u])if(v^fa){ if(!dfn[v]) {tarjan(v,u),low[u]=min(low[u],low[v]);if(low[v]==dfn[u]) /*方邊*/;else if(low[v]dfn[u])/* round edge */;} else low[u] = min(low[u],dfn[v]);}}快來做題!例1。\(\text{[bzoj 4316] }\) small $\ \rm c\ $獨(dú)立集
首先,如果這是一個(gè)樹形結(jié)構(gòu),可以用\(dp(i,0/1)\)來求解?,F(xiàn)在問題轉(zhuǎn)移到仙人掌上了。先建立一個(gè)正方形樹,點(diǎn)與點(diǎn)之間的父子關(guān)系還是一樣的\(\mathtt{dp}\),否則我們就處理正方形點(diǎn)的值\(\mathtt{dp}\):由于原來的點(diǎn)對(duì)是一個(gè)環(huán),所以\(0/1\)的狀態(tài)實(shí)際上是兩個(gè)邊界點(diǎn)都沒有選擇。
例2。\(\text{[shoi 2008] }\)仙人掌地圖\(\text{ ii}\)
這個(gè)問題是一個(gè)巨大的坑:如果你不 t再建一棵樹,那么圓邊就容易被忽略了!記得在圓的邊緣從\(\rm tp\)減去一!
例3。\(\text{[haoi 2016] }\)地圖
首先對(duì)問題的含義進(jìn)行轉(zhuǎn)換,發(fā)現(xiàn)所要求的其實(shí)是點(diǎn)\(x\)在正方形樹的子樹中,其油膩度\(\le y\)為奇數(shù)/偶數(shù)的拉面品種。
對(duì)于子樹問題,一個(gè)角度是\ (\ text {dsuotree/} \)線段樹合并,即直接搞子樹;另一個(gè)角度是用\(\rm dfs\) sequence把它變成一個(gè)序列問題,這樣就可以用掃描線(這個(gè)問題不可以)\(\text{/ }\)之類的算法來阻擋。
讓 讓我們?cè)谶@里詳細(xì)討論一下阻塞法。奇數(shù)/偶數(shù)品嘗時(shí)間是很好的統(tǒng)計(jì)數(shù)據(jù),關(guān)鍵是如何限制 油膩度 ??梢韵氲接脴湫螖?shù)組,但是修改復(fù)雜度就變成了\(\mathcal o(n\sqrt n\log n)\)的事情。其實(shí)可以用range blocking(這是第一次看到qwq),把\(s(b,0/1)\)定義為權(quán)值屬于出現(xiàn)次數(shù)為偶數(shù)/奇數(shù)的第\(b\)塊的簇的個(gè)數(shù),通過一次修改即可實(shí)現(xiàn)\(\mathcal o(1)\)。
我還沒有 我還沒有寫代碼。我 我有時(shí)間的時(shí)候會(huì)寫的。
標(biāo)簽:
子樹點(diǎn)
了解更多袁方圓百度百科(袁方圓百科)相關(guān)內(nèi)容請(qǐng)關(guān)注本站點(diǎn)。