莫隊總結 莫隊例題

2021-09-19 12:19:35 字數 1852 閱讀 7051

假設我們已知區間  l,r,需要計算的區間為  l,r,由於 l 和 r分別只能單步轉移,所以需要的時間複雜度為| l-l |+|r-r|。相當於把兩個區間分別看成是平面上的兩個整點p1(l,r)和p2(l,r)兩點之間的轉移開銷為兩點之間的曼哈頓距離。連線所有點的最優方案為一棵樹,那麼整體的時間複雜度就是這棵樹上所有曼哈頓距離之和。

於是乎最優的複雜度肯定是這棵樹是最小生成樹的時候,也就是曼哈頓距離最小生成樹

我們先對序列分塊,然後以詢問左端點所在的分塊的序號為第一關鍵字,右端點的大小為第二關鍵字進行排序,按照排序好的順序計算,複雜度就會大大降低。

有總時間複雜度就是

普通的不帶修改的莫隊演算法要把每個詢問帶上兩個關鍵字排序,現在待修改的莫隊演算法要帶上三個關鍵字排序。 這也是主要思想,和普通的莫隊一樣很簡單的思想。 原本的莫隊是[l,r]向連邊推,現在帶修改那麼就設設三元(l,r,x),x為已經操作了x次修改,可以向(l±1,r,x),(l,r±1,x),(l,r,x±1)推,原理一樣。

在進行修改操作的時候,修改操作是會對答案產生影響的(廢話)

那麼我們如何避免修改操作帶來的影響呢?

首先我們需要把查詢操作和修改操作分別記錄下來。

在記錄查詢操作的時候,需要增加乙個變數來記錄離本次查詢最近的修改的位置

然後套上莫隊的板子,與普通莫隊不一樣的是,你需要用乙個變數記錄當前已經進行了幾次修改

對於查詢操作,如果當前改的比本次查詢需要改的少,就改過去,反之如果改多了就改回來

說的聽繞口的

比如,我們現在已經進行了3次修改,本次查詢是在第5次修改之後,那我們就執行第4,5次修改

這樣就可以避免修改操作對答案產生的影響了

以下內容借鑑自洛谷題解

原版莫隊是將區間(l,r)視為點(l,r),帶修改的即加一維時間軸(l,r,t)

對於t軸的移動可以儲存每次修改,如果修改在(l,r)間則更新

分塊方法可以參照原版莫隊,先將l分塊,再將r分塊,同一塊的按t排序

塊大小為(n*t)^(1/3)可以達到最快的理論複雜度(n^4*t)^(1/3)證明如下

設分塊大小為a,莫隊演算法時間複雜度主要為t軸移動,同r塊l,r移動,l塊間的r移動三部分

t軸移動的複雜度為n*n*t/a*a,r塊l,r移動複雜度為n*a,l塊間的r移動複雜度為n/a

三個函式max的最小值當a為(n*t)^(1/3)取得,為(n^4*t)^(1/3)

題意:乙個n個數的陣列,m次詢問,問選 l,r 範圍內二個相同的數的概率,

思路:維護區間數的個數,莫隊模板題,沒什麼好說的

題意:給n個數的陣列,m次操作,每次操作求l,r範圍內有多少對i,j    a[i]^a[i+1]^.....^a[j]==k;

思路:先求出a的字首異或和,a[j]^a[i-1]==k說明就有一組滿足,用莫隊維護每個數在l,r內的數量,答案就是a[x]*a[x^k],當然要對k=0特殊討論,注意      當a[i]^a[j]==k時,其實區間最小可以為 i+1,j

題意:乙個n個數的陣列,m次操作 操作1求區間l,r有多少個不同的數,操作2 單點更新

思路:維護區間數的個數,帶修改莫隊模板題,沒什麼好說的

題意:給乙個n個數的陣列,m次操作  操作1求區間l,r  cx 表示區間l,r  x的出現次數,求mex(c0,c1..),操作2 單點更新

思路:先離散化 a[i],和操作2的 val,   用陣列num1記錄區間l,r數的出現次數,陣列num2記錄區間l,r出現 num1出現的次數

既 :假設區間  l,r有個數為x 那麼num1記錄x的數量,   假設num1[x]=y  那麼num2記錄y的數量   暴力找答案,然後帶修改套莫隊演算法模板即可

莫隊經典例題

本題做法 莫隊 分塊 輔助 1用莫隊統計區間內每個數的個數以及所在塊中數的個數和種類數.2.分塊按照值域分,整塊直接加上處理後的區間的相關資料,碎塊暴力列舉並統計在範圍內的數.具體看 include define n 100005 define in read define re register ...

莫隊演算法 普通莫隊 智慧型暴力例題模板

1 基礎莫隊演算法2.莫隊演算法實現 莫隊演算法把排序做了簡單的修改,就把暴力法的複雜度從o mn 提高到o n n 1 暴力法的排序 把查詢的區間按左端點排序,如果左端點相同,再按右端點排序。莫隊演算法的排序 把陣列分塊 分成 n塊 然後把查詢的區間按左端點所在塊的序號排序,如果左端點的塊相同,再...

莫隊講解 普通莫隊

結束了分塊,我們來講下莫隊。據我所知,莫隊能解決一切區間問題,除了翻轉。因為它就是個暴力 其實這兩者的關係並不大。僅僅是時間複雜度一樣而已。我們把原序列分成 n塊 好像就是這裡相同 這裡說的序列是查詢序列l r,並不是讀入的a i 之後我們把序列排序 按照第一關鍵字為左端點所在的塊的大小,如果相同就...