莫隊演算法基礎與練習

2022-05-10 22:58:37 字數 2069 閱讀 6100

gym卡了莫隊,於是趁這個機會學一下莫隊

莫隊的核心是分塊排序,這種特殊的排序方法將任務按排序後的順序完成,可以在解決絕大多數無修改的離線區間問題中極大的優化時間(優化了sqrt ( n )左右)。

nbut - 1457

題意:n個數,尋問10000次,任意區間內的相等數的次數的立方和。

題解:將n個數離散化後,用莫隊將詢問分塊排序,暴力計算出答案,在按原順序輸出結果。

#include#include#include#include#include#define ll long long

using namespace std;

ll n,a[100007],t,head,maze,size,ak[100007],num[100007],ans[100007],b[100007];

struct madokama[100007];

long long int qpow(long long int x,long long int n)

x=x*x;

x=x;

n>>=1;

} return res;

}bool cmp(madoka a1,madoka a2)

while(r>ma[i].r)

while(lcodeforces - 220b

題意:n個數,尋問10000次,任意區間內的相等數的次數與其數相等的個數。

題解:與上題差不多,但有個坑要注意下,離散化後會導致值改變,所以某數的次數要與它離散化前比較,之後便是莫隊板子。

#include#include#includeusing namespace std;

int n,m,t,a[100007],b[100007],num[100007],size,maze,head,ak[100007],ans[100007];

struct madokama[100007];

bool cmp(madoka a1,madoka a2)

num[a[r]]--;

if(num[a[r]]==b[a[r]])

r--;

} while(l>ma[i].l)

num[a[l]]++;

if(num[a[l]]==b[a[l]])

} while(lcodeforces - 940f

題意:給乙個長度n陣列,a陣列記錄值,q次操作,兩種操作,一種修改a+p位置的值,一種算 l , r 區間的值的個數的mex(mex指,如果有s個相等的數,那s是好的,然後你要輸出最小的不好的。如mex=3,說明區間內有相等的數的個數為1的存在,為2的存在,為3的不存在)。

題解:傳送門

#include#include#include#include#includeusing namespace std;

int n,q,ans[200007],a[200007],b[200007],l,r,z,size,head,maze,ak[200007],num[200007],cnt[200007];

vectorlsh,qans;

struct madokaho[200007],lin;

vectorma;

bool cmp(madoka a1,madoka a2)

while(lma[i].l)

while(p=ho[p].p)

a[ho[p].p]=ho[p].r;

} while(p>ma[i].p)

if(ma[i].l<=ho[p].p&&ma[i].r>=ho[p].p)

a[ho[p].p]=ho[p].l;

p--;

} for(int j=1;j<=n;j++)

} }}int main()

head+=size;

} for(int i=1;i<=n;i++)

for(int i=1;i<=q;i++)

else

} for(int i=1;i<=n;i++)a[i]=b[i];

dis();

sort(ma.begin(),ma.end(),cmp);

go();

for(int i=0;i}

基礎莫隊演算法

最好是會一點線段樹,不會也沒有關係 我們都知道,維護區間資訊的時候通常會用到各種線段樹,因為其本身具有的性質可以在很快的速度內完成各種操作。但是這是基於我們上推 pushup 和下推 pushdown 這兩種操作可以在o 1 的時間內完成的基礎。如果這兩個操作本身需要的時間不是常數級別的化我們可能需...

( 其他演算法與技巧 ) 莫隊

其他演算法與技巧 莫隊 推薦閱讀 在使用莫隊時總有些題目卡莫隊,這時候就需要用到奇偶優化 快讀來進行提速。struct node q 200005 int rule node a,node b q i l read q i r read q i bl q i l 1 sqrt n 2 1 首先明確 ...

樹上莫隊演算法

繼續回來寫部落格 記錄點有意思的題目什麼的。貌似寫過這個的沒多少人 所以我也記錄一點。首先序列上的莫隊大家都應該很熟悉了 那麼樹上的莫隊要怎麼搞呢?先來看個題目 spoj cot2 求樹上兩點間路徑上有多少個不同的點權。序列上的莫隊是把詢問按照左端點分塊了 可是樹上沒有左端點,怎麼辦呢?我們把樹分塊...