mex
介紹¶
\(\text{mex}(S)\) : 回傳最小沒有出現在集合 \(S\) 的非負整數
例如 :
-
\(\text{mex}( \{1, 2, 4\} ) = 0\)
-
\(\text{mex}( \{0, 1, 2, 4\} ) = 3\)
-
\(\text{mex}( \{0, 1, 2, 3\} ) = 4\)
code
模版測試 YOJ 1376. Mex
給你一個長度為 \(n\) 陣列 \(a_1,a_2,\ldots ,a_n\),請你求出 \(\text{mex}(\{a_1,a_2,\ldots ,a_n\})\)
code
例題¶
區間 mex 洛谷 P4137
給一個長度為 n 的序列 \(a_1,\ldots ,a_n\),有 \(q\) 筆詢問 :
- \(\text{mex}(\{a_l,\ldots ,a_r\}):\) 回傳最小沒有出現在 \(\{a_l,\ldots ,a_r\}\) 的非負整數
\(n,q\le 2\times 10^5\)
思路
離線處理,將 query 按照 \(l_i\) 小到大 sort
我們開一顆值域線段樹第 i 項紀錄 i 在當前離線的左界後第一次出現的位置
我們就只要在線段樹上二分到最小的 i 使 max(0, i) > r
複雜度 O((n + q) log n)
code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 |
|
CF 1844 B. Permutations & Primes
問 \(1,2,\ldots ,n\) 的 permutation 裡面,最多能有幾個區間裡面的數自 \(\text{MEX}\) 起來是質數,輸出這個 permutation
\(n\le 2\times 10^5\)
思路
首先觀察每個位置會有幾個區間 \((l,r)\) 覆蓋到,以 \(n=5\) 為例,每個 \(cnt_i=\)左邊的數字個數 \(\times\) 右邊的數字個數 :
如果一個 subarray 裡面沒有 \(1\) 那 \(\text{MEX}\) 就是 \(1\),所以 \(1\) 需要放在最多個區間 \((l,r)\) 會覆蓋到的位置,也就是最中間
顯然 \(\text{MEX}\) 要是越大的數字越難達到,那不如我們就先考慮比 \(1\) 大一點的質數 \(2\)。我們想要使盡量少的區間覆蓋到 \(2\),使得盡量多的區間 \(\text{MEX}\) 是 \(2\),那麼放在最邊邊一定是最好的,不失一般性假設 \(2\) 是放在最前面。
我們來整理一下目前的區間包含 \(1,2\) 的情況
-
沒有 \(1\),有 \(2\) \(\Rightarrow \text{MEX}=1\)
-
沒有 \(1\),沒有 \(2\) \(\Rightarrow \text{MEX}=1\)
-
有 \(1\),沒有 \(2\) \(\Rightarrow \text{MEX}=2\)
-
有 \(1\),有 \(2\) \(\Rightarrow \text{MEX} > 2\)
發現前三種情況的 \(\text{MEX}\) 已經固定,所以我們要想辦法使第四種的 \(\text{MEX}\) 是質數的區間個數盡量多。有 \(1\),有 \(2\) 的區間一定是 \(l=1,r\ge \text{mid}\),而 \(3\) 是大於 \(2\) 的第一個質數,也就是 \(\text{MEX}\) 最好達到的質數,所以我們要使 \(l=1,r\ge \text{mid}\) 的區間包含 \(3\) 的個數要越少越好,那當然就是把 \(3\) 放在陣列的尾端。
實作上將 \(2\) 放頭,\(3\) 放尾,\(1\) 置中,其他數字隨便放,就樣就完成此題了