問題描述
你需要維護一個資料結構,支援:加入/刪除一個區間,加入/刪除一個點,查詢是否存在區間到點的完美匹配,使每個區間都在匹配中。保證任何時候不存在兩個互相包含的區間。
題解
考慮 Hall 定理,發現如果選出若干個區間,那麼我們只關心這些區間的並。進一步可以發現只用考慮這個並是一個連續區間的情況。設這個併為 \([L,R]\)。由 Hall 定理,我們只需要任意一個 \([L,R]\) 包含的區間個數 \(\le\) \([L,R]\) 的點個數。
那麼如果存在一個區間 \([l,r]\supseteq [L,R]\),那麼 \([L,R]\) 必然不包含任何區間,此時顯然成立。
否則,記 \(s_i\) 為字首點的數量,\(a_i\) 為右端點 \(\le i\) 的區間數量,\(b_i\) 為左端點 \(\le i\) 的區間數量,分討發現包含於 \([L,R]\) 的區間數量即為 \(a_R-b_{L-1}\)(用到 \([L,R]\) 不包含於任何區間的性質!),則合法當且僅當對於所有 \(L\le R\) 有 \((s_R-s_{L-1})-(a_R-b_{L-1})\ge 0\),即 \((b_{L-1}-s_{L-1})+(s_R-a_R)\ge 0\)。
於是在每個線段樹節點上分別維護 \(b_i-s_i\) 和 \(s_i-a_i\) 的最大值,只需支援區間加,求最大值即可,合併左右兒子節點是容易的。時間複雜度 \(O(n\log n)\)。