【基於歸併排序的分治】統計問題

題目是這樣的:給你一個N*N的矩陣,可以完成兩個操作

      1.修改某個格子的權值;2.查詢某個矩形的權值。

 

看到題目以後很快想到的是二維樹狀數組,但是N<500000;Q<200000;空間上顯然承受不了,第二個選擇就是二維動態線段樹,弊端是編程複雜度大,常數大,估計寫出來是不可能的了。。。

 

不過既然有這種題目,那麼就一定是有解決辦法的,在線算法不行,可以考慮離線算法,這個離線算法應該怎麼做呢?

深入考慮這道題,發現他相當於是要滿足在3個偏序集的基礎上進行統計---時間、x座標、y座標,怎樣纔可以滿足條件呢?對於2個偏序集,我們常用的方法是對其中某一個偏序集進行排序使其成爲全序集,再用數據結構統計另一個偏序集。3個應該怎麼辦?

 

(看了題解後)應該還記得經典的統計逆序對的算法吧-有兩種做法,基於算法的歸併排序,基於數據結構的樹狀數組,逆序對就是2個偏序集,如果歸併排序加上樹狀數組能不能維護3個偏序集呢?答案是肯定的!

 

根據剛纔的思想我們便設計出了一個非常漂亮的算法,對於一段區間[l,r](時間)上的操作,我遞歸成[l,m],[m+1,r]那麼現在我們現在還沒有統計的就是[l,m]中的1操作對[m+1,r]中的2操作的影響,我們便把它們單獨拿出來算一遍就可以了(按x排好序,對y用樹狀數組統計)。

 

複雜度爲O(QlogQlogN),歸併排序和樹狀數組都屬於常數非常小的算法,所以500000的數據只要1S,總之這是個非常漂亮的算法!

 

編程複雜度極低:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章