• 給出一棵樹,維護點集 𝑆(加點刪點)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
• 剛開始你有 𝑛 個序列,剛開始序列都是長度爲 1 的
• 每次支持拼接兩個序列,問每一個序列的每一個子區間的最小值的和
• 𝑛 ≤ 10^6
笛卡爾樹,
每一個點的貢獻就是左右兒子sz乘積
拼接?笛卡爾樹合併
定義關鍵點:一個樹最左邊和最右邊兩個鏈
關鍵點只有初始的O(n)個
合併x,y時候,對於x的右鏈和y的左鏈,從最底下開始往上找到第一個能放的位置,這一段長度設爲len
以後這段關鍵點會被覆蓋住,再也不存在。
而後y的這個點左兒子和x的這個點的右兒子進行相似fhq的合併,也就是通常的暴力合併
因爲路徑上的點就是兩個段的關鍵點
關鍵點而後就消失了。
走的長度就是關鍵點減小的個數
因此均攤O(n)
從最底下開始找,能夠用鏈表而後鏈表合併。單純記錄每一個點最右邊的點也能夠
sz什麼的pushup就找到了。
(pushup這個不太好找到,最開始一段鏈很難搞。能夠用LCT同時和笛卡爾樹合併作,用於打上標記)
挺trick的