#46170: 解題思路


henry.rem.rem@gmail.com (*ฅ́˘ฅ̀*)

學校 : 臺北市立松山高級中學
編號 : 278368
來源 : [61.231.20.66]
最後登入時間 :
2025-06-15 17:49:41

解題思路:

題意簡潔明瞭,在尋找幸運數字的過程中,

我們需要尋找最小的數字還有計算區間和,

如果逐個區間線性掃描,尋找最小值並計算總和,O(n2) 顯然無法通過所有測資。

因此我們的目標是如何加速找區間最小值和區間和。

為了快速尋找區間最小值,由於題目保證給定陣列 a 中沒有重複數字,

我們可以為每個數字記錄他的位置並另外儲存在 idx 陣列中,

即對於第 i 個數字而言 idx[a[i]] = i,

對原先數字做排序後,我們只需要對排序好的陣列往後迭代,

便可以利用 idx 陣列直接找到其在原先陣列中的位置。

而對於計算區間和的部分,可以在讀取測資的同時製作前綴和 prefix 陣列,

後續計算時便可以透過

prefix[m - 1] - prefix[L - 1] 和 prefix[R] - prefix[m]

以 O(1)快速求得 m 左右側的區間和。

實作策略:

由於題目中數字範圍可能很大,介於 1 ~ 107

但數字的數量卻相對少,只有 1 ~ 3 * 105

因此不建議直接開一個超大的陣列儲存所有可能出現的數字的位置,

而是利用 map 、 unordered_map 或是自己用 vector 實現離散化,避免佔用過量記憶體。

範例解法