【關鍵字】偏序,數點,樹狀陣列,線段樹,掃瞄線。
因為涉及多種演算法,所以整合到一起。
【掃瞄線】
二維數點,偏序
★數點問題
★關於偏序問題的一些總結
掃瞄線是一維離線的做法的統稱,常用於解決k維偏序問題。
離線:將其中一維的詢問排序後按順序處理,從而實現按時間順序處理的過程中可以o(1)統計空間上小於某個數字的答案。
將一維離線稱為掃瞄線,就是因為離線的那維處理過程很像一條線按順序掃瞄。
偏序:以二維偏序為例,對於任意(x,y),必須滿足x<=a&&y<=b,也就是有兩個單向限制,則是二維偏序。
掃瞄線解決k維偏序問題是經典中的經典。
一維偏序:排序掃瞄線 樹狀陣列
二維偏序:排序掃瞄線+樹狀陣列(差分)/線段樹
三維偏序:排序掃瞄線+cdq分治+樹狀陣列 排序掃瞄線+二維資料結構
資料結構實際上就是普通的處理一維,排序(離線)後按順序就是用掃瞄線特殊的處理一維,k維中只有一維能使用掃瞄線。
一維用掃瞄線後,另一維用樹狀陣列維護字首和(包括前面行的,每個元素都代表一列),這就是典型的二維偏序問題解法了。
掃瞄線就是主要用於解決k維偏序問題的,而解決矩陣數點問題完全是利用偏序問題來解決的。
矩陣可以理解為四個限制(四位偏序),但是兩維和另兩維之間有直接關係,所以可以差分成四個二維偏序,這樣就只要在二維偏序的時候兩維分別差分即可。
例題:★經典【stsrm13】綿津見 二維偏序,排序+樹狀陣列
【bzoj】1537: [poi2005]aut- the bus 排序+線段樹
bzoj 4822: [cqoi2017]老c的任務 等待解決=v=
嗷嗷待補:
[bzoj3161]布娃娃(掃瞄線+線段樹)
矩陣面積並
hdu 1542 掃瞄線+線段樹求矩陣面積並
線段樹輔助——掃瞄線法計算矩形面積並
【鏈與反鏈】
引用自:最長反鏈與最小鏈覆蓋 by vfleaking
大前提:在dag上(有向無環圖)
鏈是點的集合,這個集合中任意兩點單向可達。
反鏈是點的集合,這個集合中任意兩點互相不可達。
★最小鏈覆蓋=最長反鏈
最小反鏈覆蓋=最長鏈
經典模型:最少嚴格遞減子串行覆蓋=最長不嚴格遞增子串行
最少不嚴格遞增子串行覆蓋=最長嚴格遞增子串行(鏈與反鏈的互補關係)
不嚴格證明:從二分n log n求lis的過程中可以得到一組合法解。
二分求解lis:從前往後每個數字在替換掉序列b中第乙個》=它的數字(這個數字的位置就是f[i]),如果沒有則加在末尾。
二分過程中乙個位置當前和之間的所有數字組成乙個不增子序列,位置總數就是最長上公升子串行。
int k=0view code;
for(int i=1;i<=n;i++)
(順便一提,lis還可以寫樹狀陣列,查詢值域字首max,值域離散化——注意樹狀陣列不能處理ai=0的情況,需整體+1)
這樣替換的正確性在於:訪問某位置時,其前面的位置一定存在數字在該位置之前(反證:若不存在,則一定會替換該位置),這樣傳遞下去可以找到上公升子串行。
最長上公升子串行(lis)本質上是二維偏序,要求滿足a[i]也可以視為二分圖不交叉最大匹配(上帝選人):一維排序(a[i]),一維可以樹狀陣列維護dp,也可以二分。
鏈模型轉化:對於所有滿足滿足a[i]h[j]的點i和點j連線有向邊,最長鏈覆蓋=最長反鏈。
noip 1999 飛彈攔截
★【bzoj】1143: [ctsc2008]祭祀river
鏈覆蓋:floyd傳遞閉包(轉化為可達資訊),轉化為最小路徑覆蓋,ans=n-最大匹配(二分圖)。
掃瞄線專題
想法 我們根據題目的意思不難發現,我們可以維護乙個x軸區間對應的 y 值的最大值。然後我們去遍歷我們的 x 軸對應的 y 值,如果前面乙個和當前的 y 相同就說明還是直線,沒有出現轉折點。但是出現了乙個問題就是 為了避免邊界出現問題,所以我們採取和掃瞄線一樣的做法,讓 l,r 代表 l,r 1 in...
P5490 模板 掃瞄線 掃瞄線
題目描述 求 n 個矩形的面積並。輸出格式 一行乙個正整數,表示 n 個矩形的並集覆蓋的總面積。発生 線段樹開小了,因為n變成了兩倍,線段樹就得開4 2 8倍 對每一根掃瞄線,維護所截得的長度,每次乘以兩根掃瞄線高度差就得到了面積並 截得長度用線段樹維護即可 注意線段樹需要離散化 include i...
掃瞄線入門
聽說掃瞄線很牛掰,於是就見識了一下。之前做過一道掃瞄線的題,brother,就是判斷矩形是否被矩形內部的車攻擊到。當時是把矩形拆成出邊和入邊 豎直的 把所有小於x2的車加進圖中,掃 y1,y2 中x最小的車的x.和x1判斷比較。然後交換x,y掃一遍 當時只是感覺線段樹很神奇,還可以這樣搞,後來才知道...