莫隊講解 普通莫隊

2022-08-18 07:00:15 字數 816 閱讀 8600

結束了分塊,我們來講下莫隊。

據我所知,莫隊能解決一切區間問題,除了翻轉。因為它就是個暴力

其實這兩者的關係並不大。僅僅是時間複雜度一樣而已。

我們把原序列分成√n塊(好像就是這裡相同)。這裡說的序列是查詢序列l--r,並不是讀入的a[i].

之後我們把序列排序:按照第一關鍵字為左端點所在的塊的大小,如果相同就按照右端點大小排序。

總時間複雜度均攤之後是o(n√n)。

因為針對每√n次查詢,左端點一共移動了√n次,而右端點一共移動了n次。

總時間複雜度再乘上√n,就是o(n√n+n)。完美!

有人會說:「莫隊有何用啊,我線段樹解決!」別急,看例題

bzoj1878 [sdoi2009]hh的項鍊

求區間有多少種不同的數。

線段樹成功gg,因為它並沒有區間加和性。

考慮莫隊加上乙個桶,用delete和add函式解決,輕鬆ac

#include#includeusing namespace std;

#define mod 240

struct node

query[200001];

int n,q;

int a[50001];

int sum[1000100],ans;

bool cmp(const node &a,const node &b)

sort(query+1,query+q+1,cmp2);

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

printf("%d\n",query[i].daan);

}

莫隊演算法講解

問題 有n個數組成乙個序列,有m個形如詢問l,r的詢問,每次詢問需要回答區間內至少出現2次的數有哪些。樸素的解法需要讀取o nm 次數。如果資料範圍小,可以用陣列,時間複雜度為o nm 如果使用stl的map來儲存出現的次數,則需要o nmlogn 的複雜度。有沒有更快的方法呢?得出。如果能安排適當...

莫隊演算法學習筆記(一) 普通莫隊

前言 在學習莫隊演算法之前,我一直以為這是乙個很高深的演算法。實際上,它就是乙個很高深的演算法 這個演算法玄學地將分塊與暴力兩大演算法實現了二合一,從而打造出了乙個時間複雜度為o n n o n sqrt n o nn 的求解多個區間詢問的離線演算法。具體介紹 首先,我們以詢問中l ll所在的區間為...

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

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