contents
Problem
背景
大學上課是怎麼回事的呢?談論到學期成績計算,很多奇聞軼事可以說的,例如教授任選三題批改、同學任選三題作答、滿分三百、沒有考試、 … 等。筆試類型的考試只是最常見的一種,還有所謂的多才華加分,例如上台報告、舉手發問、參與展覽、參加競賽、 … 等。
不幸地,某 M 修了一堂怪課,教授每一堂課結束後總是會大聲宣揚「葛萊分多加 5 分」對於需要不斷複習演練的某 M 而言,這門課的即時評分方式讓其非常挫敗。神奇的是,有一次教授這麼問同學「給一序列,請計算眾數、平均數、中位數,答對加分。」某 M 剎那間傻住,大學的學期成績可以用這種問題獲得,當他在懷疑這個問題時,問題早已被同學回答走。
某 M 非常不甘心,計算眾數、平均數、中位數就能夠加分,要求只是 n = 10 的序列。既然加分有理,出題吧!
題目描述
平均數、中位數可以藉由區間總和、區間 K 小問題來完成,現在來解決眾數。
給定一個長度為 $n$ ( $1 \le n \le 100000$ ) 的正整數序列 $s$ ($1 \le s_i \le n$),對於 $m$ ( $1 \le m \le 1000000$) 次詢問 $l, r$,每次輸出 $[s_l, \text{... },s_r]$ 中,出現最多次的次數以及有多少種數字出現最多次。
Sample Input
|
|
Sample Output
|
|
Solution
眾數區間查找 Range mode query 性質可以參考維基百科。
在這一題中,這裡提供三種解法,但我的寫法中只有莫隊算法可以通過,其餘算法受到時間跟空間上的限制,需要額外的優化,細節就不多做說明:
- 莫隊算法
只能離線處理,無法強制在線詢問,維護眾數最高頻率指針,來統計眾數的對應次數和等價眾數的個數,由於指針移動都是 $O(1)$,整體上時間效能為 $O(N^{1.5})$。 - 分塊在線 1
離線預處理 $O(N^{0.5} \times N^{0.5} \times \log{N})$
提供在線詢問 $O(\text{ans} \times \log{N})$,由於知道每一個塊中的代表眾數都可能是答案,因此預處理每一個塊的眾數,其餘的非眾數捨棄掉,最慘情況是每個數字都出現一次,在線詢問時複雜度會掉到 $O(N \log N)$。 - 分塊在線 2
- 離線預處理時間 $O(N \times L^2)$,提供在線詢問 $O(N/L)$,其中 $L$ 表示有多少個分塊。
- 預處理分塊編號 $PILE[i, j]$ 的眾數情況 (類似莫隊維護指針),因此記憶體消耗 $O(N \times L^2)$。
- 對於每一處詢問,會對應預處理中的區域塊的紀錄 $PILE[L, R]$,接著頭尾兩端的殘存數字再依序加入,意即 $A[a, L-1]$ 和 $A[R+1, b]$ 的數字加入的複雜度 $O(1)$,隨後再進行撤銷 $O(1)$。
- 假設詢問次數 $Q$ 與 $N$ 呈現性關係,整體需要 $O(N \times L^2 + N^2 / L)$,則 $L = N^{1/3}$ 是最好的情況,意即每一個塊具有 $O(N^{2/3})$ 個數字,最後得到整體時間效能為 $O(N^{1.66})$。
由於這一題目標不是找到眾數為何 (這牽涉到最小字典順序),而是找眾數的出現個數和有幾種眾數可能,莫隊算法會快於其他算法。若是要求最小眾數莫隊算法需要 $O(N^{1.5} \log{N})$,分塊在線 1 也是 $O(N^{1.5} \log{N})$。
分塊在線 2 在此題不僅僅遇到記憶體過大,只好鬆弛 $L$ 來壓低記憶體用量,但增加時間需求,時間上慢個 10 倍以上。
莫隊算法
|
|
分塊在線 1
|
|
分塊在線 2
|
|