P3647 連珠線 題解

2022-03-12 11:39:35 字數 798 閱讀 8663

portal

首先它從遊戲開始到結束,是始終只有乙個連通塊的。對於連紅邊,那就直接連就可以了。對於連藍邊,我們首先需要找到一對有紅邊直接相連的點,然後拆散它們把新點插進去,然後仍然是乙個連通塊。稍微等價理解一下,發現其實就是一次連紅邊是從當前連通塊伸出去乙個點;而連藍邊肯定是一下就有兩條,我們把這次藍邊所對應的紅邊與這次連藍邊看作乙個整體,它可以看成從當前連通塊伸出去乙個長度為 \(2\) 的鏈,其中邊是藍色的。

於是我們可以欽定乙個點為起始點,把給定樹看作以它為根。那麼顯然在往下伸出去的時候,一口清伸出去的長度為 \(2\) 的鏈只可能是兩端是爺孫關係,而不可能是兄弟關係了。好了!這樣就很好 dp 了。

顯然乙個點只可能作為鏈的中心 \(0\sim 1\) 次。那麼我們考慮 \(dp_\) 表示子樹 \(i\) 內的藍邊最大和,如果第二維為 \(1\) 的話表示 \(i\) 是一條鏈的中心(它下面有一條邊與通向爸爸的邊配對)。轉移的話,如果為 \(0\) 那麼所有兒子都必須是下面剩、邊選或下面不剩、邊不選,取個 \(\max\) 加起來即可,不需要有什麼顧慮;為 \(1\) 的話就必須有且只有乙個兒子是下面不剩、邊選,找 \(\delta\) 最大的那個減了加上即可。

然後套路的換根即可。這個求和可逆,不用煩;而求 \(\delta\) 的 \(\max\) 可以直接無腦的維護乙個set新增刪除即可,複雜度線性對數。然而發現在換根的過程中,乙個點的set只會被連續刪除 \(1\) 次元素,於是實時維護最大值和次大值即可線性,對應的也麻煩一點。

code

Luogu P3647 連珠線 題解報告

題目傳送門 題目大意 思路分析 好的這道題目我在換根dp的部分卡了乙個世紀 所以設狀態真的很重要,我因為狀態設的不好,然後換根的時候就很複雜qaq 我來講一下乙個學長 的做法叭qwq 最後的連線情況是一棵樹,首先我們要發現兩個性質,就是在樹中藍線一定是連線在父子之間,並且連續的一段藍線一定為偶數。因...

P3647 APIO2014 連珠線 換根DP

傳送門 我們通過分析 手動模擬能夠發現,藍線的形態只有兩種 son u 1 u son u 2 和 son u u fa u 對於每乙個節點,要麼是乙個藍線的中點,要麼就是藍線的端點,所以我們設 f u 0 表示 u 為藍線端點時的答案,f u 1 表示 u 作為中點時的答案 轉移方程如下 f u ...

APIO2014 連珠線 題解

我們設初始的那個點為root。則所有的藍色鏈都是形如fat her now so nfather now son father now son 我們設計兩個dp狀態 dpi 0 dp dp i,0 表示i號點不作為藍色鏈的中間點,dpi 1 dp dp i,1 表示作為中間點。則以下的轉移就非常容易...