結束了分塊,我們來講下莫隊。
據我所知,莫隊能解決一切區間問題,除了翻轉。因為它就是個暴力
其實這兩者的關係並不大。僅僅是時間複雜度一樣而已。
我們把原序列分成√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塊 然後把查詢的區間按左端點所在塊的序號排序,如果左端點的塊相同,再...