因為被 NOIP2024T4 吊打了,所以決定練一些 DS 題。
[Ynoi2006] rldcot
區間 LCA 顏色數。
考慮一個能成為答案的 \(x\),要麼有 \(x\in[l,r]\),要麼存在其不同子樹內的兩個點 \(u,v\) 都在 \([l,r]\) 內。
注意到一個極小的 \((u,v)\) 才是有用的,即如果存在 \(u',v'\) 使 \(u<u'<v'<v\) 那麼就可以把 \(u,v\) 踢掉了。
因此可以 DSU on tree,對每個輕子樹內的節點找到前驅後繼,顯然這樣的數對個數是 \(O(n\log n)\) 的,然後就掃描線數顏色就可以了。
[Ynoi2011] 成都七中
查詢只保留 \([l,r]\) 的點後,\(x\) 所在的連通塊的顏色數。
棘手的部分在於如何刻畫「連通塊」,考慮轉化為 \(\{p|\mathrm{path}(p,x)\subseteq [l,r]\}\),因此只需要關注 \(\mathrm{path}(p,x)\) 中的最小值與最大值。——這樣我們就把棘手的「連通塊」轉化為了路徑問題。
這很點分治,所以考慮點分治。
點分治其實有一個很好的性質,就是對於任意一個連通塊總存在連通塊內的一個點使其在點分樹中的子樹包含一整個連通塊,其實這個點就是連通塊內所有點在點分樹上的 LCA。證明是 trival 的。
所以可以在點分樹上跳 \(x\) 的祖先,然後找到這個點,容易發現它就是點分數上深度最小的在連通塊上的點,設為 \(p\)。
然後你發現此時所有連通塊的點就是 \(\{q|\mathrm{path}(p,q)\subseteq [l,r]\}\),離線之後掃描線數顏色就可以了跟上一題一模一樣啊話說這題真的有黑嗎。
Written with StackEdit中文版.