1. 程式人生 > >低水平選手的自我救贖 (1)CLRS Exercise 16.5-2

低水平選手的自我救贖 (1)CLRS Exercise 16.5-2

時間 mark 郵件 ger 前綴和 統計 題目 class 總結

題目大意

給定正整數 $n$ 和一個由 $m$ 個正整數構成的可重集合 $A$,滿足 $\forall a\in A,?a\le n$ 且 $m\le n$ 。
定義 $N_t(A) = |\{a\in A\colon a\le t\}|$ 。請在 $O(m)$ 的時間內判斷 $\forall t = 0, 2, \dots, n,?N_t(A)\le t$ 是否成立。
多組詢問。

解法

用一個長為 $n$ 的數組 $\mathrm{cnt}[1..n]$ 記錄集合 $A$ 中每個數出現的次數,若存在 $a\in A,?\mathrm{cnt}[a]>a$ 則結論不成立,否則成立。


這解法是錯的。來源

反例:$A=\{1,2,2\},?n=3$
(我要給 Solution Author 發郵件!)

正解在此

對於 $t \ge m$,$N_t(A)\le m \le t$ 自然成立。
只需考慮對 $t < m$ 是否有 $N_t(A)\le t$ 。

統計前綴和判斷一下即可,復雜度 $O(m)$ 。

總結

  1. 這道題真的沒那麽簡單
  2. 我的水平確實低(真心的)
  3. 我要仔細讀讀 CLRS
  4. 把自己當做小學生!

低水平選手的自我救贖 (1)CLRS Exercise 16.5-2