BZOJ 3585 Mex 莫隊 分塊

2021-10-08 15:36:25 字數 2136 閱讀 1357

description

有乙個長度為n的陣列。m次詢問,每次詢問乙個區間內最小沒有出現過的自然數。

input

第一行n,m。

第二行為n個數。

從第三行開始,每行乙個詢問l,r。

output

一行乙個數,表示每個詢問的答案。

examples

sample input

5 52 1 0 2 1

3 32 3

2 41 2

3 5sample output12

303note

1 ≤n

,m

≤200000

1 \leq n,m \leq 200000

1≤n,m≤

2000

00 0≤a

i≤10

90 \leq a_i \leq 10^9

0≤ai​≤

1091≤l

≤r≤n

1 \leq l \leq r \leq n

1≤l≤r≤

n solution

本題有多種解法,這裡考慮莫隊 + 分塊

對權值分塊,用莫隊維護當前詢問區間的每個數字出現次數以及每個塊內出現的數字種數

每次暴力找到第乙個沒滿的塊,再進去暴力找到沒出現的最小數字

複雜度 o(n

n)

o(n\sqrt)

o(nn​)

code

#pragma gcc optimize(2)

#include

#define re register

using

namespace std;

const

int maxn =

2e5+5;

inline

intread()

void

print

(int x)

if(x >9)

print

(x /10)

;putchar

(x %10+

'0');}

int n,m,blksiz, maxblk;

int a[maxn]

,blk[maxn]

, le[maxn]

,ri[maxn]

;struct queryq[maxn]

;bool

cmp(query x, query y)

int cnt[maxn]

, bnum[maxn]

, siz[maxn]

;inline

void

add(

int pos)

inline

void

del(

int pos)

int ans[maxn]

;inline

intget_ans()

}return n;

}int

main()

for(re int i =

0;i <= n;

++i)

maxblk = blk[n]

;for

(re int i =

1;i <= maxblk;

++i)

ri[maxblk]

= n, siz[maxblk]

= ri[maxblk]

- le[maxblk]+1

;for

(re int i =

1;i <= m;

++i)

sort

(q +

1,q +

1+ m,cmp)

;for

(re int i =

1, curl =

1, curr =

0;i <= m;

++i)

for(re int i =

1;i <= m;

++i)

return0;

}

bzoj3585 mex 莫隊 分塊

ac通道 題解 這題思維上有些難度,蒟蒻不得不 了popoqqq大爺題解。將1 n之間的自然數分成根號n塊,每個塊記錄當前塊中已經出現的不同的自然數的個數。那麼在查詢時只需要檢驗每個塊是否滿足r i l i 1 blo i 找到第乙個不滿足以上條件的,然後在該塊內暴力查詢即可。bzoj 3585 b...

BZOJ3585 mex 莫隊 分塊

顯然可以離線主席樹,這裡用莫隊 分塊做。分塊的乙個重要思想是實現修改與查詢時間複雜度的均衡,這裡莫隊和分塊互相彌補。考慮暴力的分塊做法,首先顯然大於n的數直接忽略,於是將值域分成sqrt n 份,每塊記錄塊內的所有值是否在此當前區間內都已存在。這樣每次暴力從l到r分別放入這個表,最後從小到大詢問每個...

BZOJ 3585 mex 莫隊演算法 分塊

題目大意 給定乙個長度為n的陣列,m次詢問某個區間內的mex值 怒寫莫隊233 將權值分成 n塊,記錄每個權值的出現次數以及每塊內有多少權值出現過 修改o 1 即可完成 查詢時首先掃一遍找到第乙個塊內有沒有覆蓋的點的塊 然後在塊內暴力查詢 時間複雜度o n 套個莫隊 總時間複雜度o m n incl...