由於我根號算法實在是太菜,所以有了這么篇不是很靠譜的總結= =
如果有問題直接戳我或者留言就好>.<
莫隊
理想莫隊信息:維護一個子集的信息,支持\(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(n\sqrt{n})\)與塊與塊之間的信息\(O(n)\)預處理
常見用法:區間眾數/逆序對
勢能分塊:一道很牛的題 [Ynoi2019] 美好的每一天~ 不連續的存在
定義勢能\(f(i)\)表示\(1\text{~}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\)(度數/出現次數)
常見用法:光速冪/度數分塊/數論分塊/分塊區間和等等