數據結構雜題集

Codechef SD ER

• 給出一棵樹,維護點集 𝑆(加點刪點)spa

• 若是 𝑆 的大小是偶數,輸出:若是將 𝑆 中的點兩兩連上邊權爲樹
上距離的邊,那麼 𝑆 裏的最小權完美匹配是多少
• 𝑛, 𝑞 ≤ 10^6io


考慮邊的貢獻鏈表

交叉必定不優,因此co

一條邊有貢獻當且僅當兩側各有奇數個點push

也就是子樹裏有奇數個點trick

點刪除增長的時候就是對到根的鏈上邊權值變成0或者變回本身壓縮

LCT維護,維護存在邊、不存在邊權值和,打「取反」標記便可。

 

經典問題

• 給出一張無向圖
• 每次刪掉一個點,求圖中邊雙連通的點對個數
• 𝑛, 𝑚 ≤ 10^6

時光倒流。刪點變成加點

再把加點改爲加邊

若是隻詢問連通性的話,並查集就能夠作

邊雙聯通和通常連通性的共同性質是:有傳遞性(x=y,y=z,則x=z)

一個並查集維護連通性,兩棵樹連通的時候,啓發式合併,把相連的點做爲小樹的根,再連上去

另外一個並查集進行路徑壓縮,維護邊雙。鏈接樹上兩個點,把兩個點到LCA路徑上的點合併起來,並查集路徑壓縮一下加速。

至於鏈接兩棵樹,第二個並查集怎麼辦:暴力從新把相關的邊鏈接一下,因此啓發式合併的條件是:非樹邊+樹邊的總和小

找LCA暴力倍增就是log^2了

能夠LCT強行維護。先access(a),再access(b) 這個時候第一個鏈接的點就是LCA

 

 

ICPC HK 2018 

• 剛開始你有 𝑛 個序列,剛開始序列都是長度爲 1 的
• 每次支持拼接兩個序列,問每一個序列的每一個子區間的最小值的和
• 𝑛 ≤ 10^6

笛卡爾樹,

每一個點的貢獻就是左右兒子sz乘積

拼接?笛卡爾樹合併

定義關鍵點:一個樹最左邊和最右邊兩個鏈

關鍵點只有初始的O(n)個

合併x,y時候,對於x的右鏈和y的左鏈,從最底下開始往上找到第一個能放的位置,這一段長度設爲len

以後這段關鍵點會被覆蓋住,再也不存在。

而後y的這個點左兒子和x的這個點的右兒子進行相似fhq的合併,也就是通常的暴力合併

因爲路徑上的點就是兩個段的關鍵點

關鍵點而後就消失了。

走的長度就是關鍵點減小的個數

因此均攤O(n)

從最底下開始找,能夠用鏈表而後鏈表合併。單純記錄每一個點最右邊的點也能夠

sz什麼的pushup就找到了。

(pushup這個不太好找到,最開始一段鏈很難搞。能夠用LCT同時和笛卡爾樹合併作,用於打上標記)

挺trick的

相關文章
相關標籤/搜索