莫隊經典例題

2021-10-09 14:30:42 字數 2293 閱讀 1054

本題做法:莫隊+分塊(輔助).

1用莫隊統計區間內每個數的個數以及所在塊中數的個數和種類數.

2.分塊按照值域分,整塊直接加上處理後的區間的相關資料,碎塊暴力列舉並統計在範圍內的數.

具體看**:

#include

#define n 100005

#define in read()

#define re register

using

namespace std;

int n,m,l,r,block;

int a[n]

,zhi,from[n]

,pos[n]

;int num[n]

;int ju[n]

;int ans1[n]

,ans2[n]

;struct zbq[n]

;inline

int in

while

(isdigit

(ch)

)return i;

}//讀優.

inline

bool

cmp(zb a,zb b)

//用三目比if快一點.

inline

void

add(

int x)

inline

void

jian

(int x)

inline

void

getans

(int a,

int b,

int id)

}return;}

intmain()

sort

(q+1

,q+m+

1,cmp)

; l=

1,r=0;

for(re int i=

1;i<=m;i++

)for

(re int i=

1;i<=m;i++

)printf

("%d %d\n"

,ans1[i]

,ans2[i]);

return0;

}

此題題面很毒,我們換乙個:

求區間[l,

r]

[l,r

]內眾數的個數.

演算法:莫隊+離散化(重點).

#include

#define n 500005

//小了會re

#define in read()

#define re register

using

namespace std;

const

int k=15;

//防止陣列下標為負數

int n,m,l,r,block;

int zhi,from[n]

,cnt[n]

,rk[n]

;int num[n]

;int ju[n]

;int ans[n]

;struct zbq[n]

;struct nodea[n]

;inline

int in

while

(isdigit

(ch)

)return i;

}inline

bool

cmp(zb a,zb b)

inline

bool

cmp2

(node a,node b)

inline

void

add(

int x)

inline

void

jian

(int x)

intmain()

//離散化

for(re int i=

1;i<=n;i++

) from[i]

=(i-1)

/block+1;

for(re int i=

1;i<=m;i++

)sort

(q+1

,q+m+

1,cmp)

; l=

1,r=

0,zhi=0;

for(re int i=

1;i<=m;i++

)for

(re int i=

1;i<=m;i++

)printf

("%d\n"

,ans[i]);

return0;

}

qwq

莫隊總結 莫隊例題

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

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

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

莫隊講解 普通莫隊

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