1.關於集合運算的推導規約,知道集合是什麼東西就一定會推導!
u:把區間[l,r]覆蓋成1
i:把[-∞,l)(r,∞]覆蓋成0
d:把區間[l,r]覆蓋成0
c:把[-∞,l)(r,∞]覆蓋成0 , 且[l,r]區間0/1互換
s:[l,r]區間0/1互換
2.倍化區間處理開閉區間的問題
。因為普通的線段樹實際處理的並非真正的區間,而是一系列點,相當於處理乙個向量
。這個問題需要處理的是真正的區間,所以應該有乙個主導思想就是,把區間點化!
不知哪位大牛搞了乙個倍增區間出來,實在佩服!
對於待處理區間[a,b](暫時不考慮開閉),對其邊界均乘2。若區間左開則對左界值+1,若區間右開,則對右界-1!
如:[2,3]會倍增為[4,6],[2,3)會倍增為[4,5],(2,3]會倍增為[5,6],(2,3)將倍增為[5,5],我們這時可以看到,對於普通線段樹無法處理的線段如(x,x+1)將被點化為[2*x+1,2*x+1]!這個問題得到比較完美的解決
最後把查詢出來的區間逆向倍增操作一下,就可以得到實際的區間以及起開閉情況!
**中還將用到延遲更新,向子節點更新操作時,這個具體糾結在互換上面,不過仔細想想還是容易理解的,下面**會有註解!
區間倍增後,就是
處理普通線段樹
了,這時候一定要思路清晰!
當然普通線段樹有兩種,1).
一種是一開一閉的形式,兄弟節點看上去好像連線起來了(由於開閉是固定的,所以無法直接來處理該題):如對於父節點[a,b),其左孩子為[a,(a+b)/2),右孩子為[(a+b)/2,b)…… 2).
另一種是全閉的形式,對於父節點[a,b],其左孩子為[a,(a+b)/2],右孩子為[(a+b)/2+1,b]……這時候一定要看清本質,不要被倍增區間搞混了!
注:題目中還要處理一些無效輸入如(4,4)這種
沒有意義的區間
POJ 3225 區間操作 交並補
u 把區間 l,r 覆蓋成1 i 把 l r,覆蓋成0 d 把區間 l,r 覆蓋成0 c 把 l r,覆蓋成0 且 l,r 區間0 1互換 s l,r 區間0 1互換 cover記錄成段覆蓋,xo記錄互換 當乙個節點得到覆蓋標記時把異或標記清空 當乙個節點得到異或標記的時候,先判斷覆蓋標記,如果是0...
poj 3225 間隙 橫截面和填充操作
一道題又做了一天。這道題對我來說起初有n多難點。1 區間的開閉怎樣解決。2 如何把區間的交並補 對稱差轉化為對線段樹的操作。後來與實驗室的同學討論了後攻克了前面兩個問題。對於區間的開閉,能夠將區間放大一倍,偶數點表示端點。奇數點表示區間內線段,前開的話左端點加1,右開的話右端點減1。比如 1,3 能...
POJ並查集小結
並查集小結 並查集大體分為三個 普通的並查集,帶種類的並查集,擴充套件的並查集 主要是必須指定合併時的父子關係,或者統計一些資料,比如此集合內的元素數目。poj 1182 經典的種類並查集 poj 1308 用並查集來判斷一棵樹。注意空樹也是樹,死人也是人。poj 1611 裸地水並查集 poj 1...