【复习笔记】根号算法总结
由于我根號算法實在是太菜,所以有了這么篇不是很靠譜的總結= =
如果有問題直接戳我或者留言就好>.<
莫隊
理想莫隊信息:維護一個子集的信息,支持(O(a))插入一個元素,(O( b ))刪除一個元素,無法比直接暴力更高效地合并
例如:給出一個點集,多次詢問點集的一個子集的信息
普通莫隊:考慮右端點O(n)變化過程中,左端點限制在一個根號塊內,也就是每次移動不超過根號,總復雜度為(O(nsqrt(m)+m))
一個卡常小trick:奇數塊正著排,偶數塊反著排常數小一半
由于莫隊是對于值域暴力維護,而修改次數是(O(nsqrt(m))),查詢次數是(O(m)),因此對于值域進行根號分治維護復雜度可以去掉線段樹的log(log-log平衡此時不如1-sqrt平衡)
普通莫隊常見題:小Z的襪子
二次離線莫隊:將莫隊當做是O( nsqrt(m) )次查詢區間中滿足特定特征的性質的數的某個信息
如果這個信息具有可減性,可以差分 考慮差分后變成O(nsqrt(m) )次查詢前綴中滿足特定特征的性質的數的某個信息 此時插入次數(O(n))而查詢次數(O(nsqrt(m))) 把插入的復雜度往上提,查詢O(1)就可以做到更優秀的復雜度
樹上莫隊:
1.樹上兩條鏈的信息差分成兩段到根的路徑(四維降成二維)此時使用普通莫隊即可
2.連通塊直接分塊
3.對括號序分塊(此時可以處理子樹信息或鏈信息 鏈信息需要特判LCA)
分塊
靜態分塊:大部分針對在線處理,預處理時對于塊信息(O(nsqrt{n}))與塊與塊之間的信息(O(n))預處理
常見用法:區間眾數/逆序對
勢能分塊:一道很牛的題 [Ynoi2019] 美好的每一天~ 不連續的存在
定義勢能(f(i))表示(1 ext{~}i)加入(i)的合并次數 因為啟發式合并 所以總數是nlogn 所以按照(f(i))加權分塊 每增量(sqrt{nlog}) 每個塊暴力啟發式合并
因為([1,r])加入(r+1)的勢能一定是大于([l,r])加入(r+1)的勢能的 因此復雜度正確
此時分塊復雜度分析為(O(FN+totF/F)) 因此一個塊內取(sqrt{totF}=sqrt{nlog})
根號重構分塊:比較常見的就是分塊維護凸包之類的東西,如果邊角塊變化就重構,不然可以直接打tag快速處理答案(比如凸包就可以使用two pointer去掉log)
根號平衡
平凡根號平衡:(sum s_i =n)此時不同的(s_i)不超過(sqrt n)(度數/出現次數)
常見用法:光速冪/度數分塊/數論分塊/分塊區間和等等
總結
以上是生活随笔為你收集整理的【复习笔记】根号算法总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 点击之后从浏览器回到微信界面的方法
- 下一篇: 坐下来,做进去,做出来