Codeforces 🟣 CF2173F. Isla's Memory Thresholds
題目的難度顏色使用 Luogu 上的分級,由簡單到困難分別為 🔴🟠🟡🟢🔵🟣⚫。
🔗 CF2173F. Isla’s Memory Thresholds
Problem Statement
題目簡述
給定一個長度為 的非遞增數列 ()。
有 次查詢,每次給定 ,模擬以下過程:
從 開始逐一累加數值,一旦當前累積總和 ,則記錄一次「清空」(計數器 +1),並將累積總和歸零,繼續處理後續元素直到 。
對於每個查詢,輸出清空次數及最後剩餘的累積總和。
Constraints
約束條件
- (非遞增)
思路:根號分治 (Square-root Decomposition) + 二分搜尋 (Binary Search)
這道題目的關鍵在於利用 是非遞增的性質。這意味著:隨著起始位置向右移動,湊滿閾值 所需的最少元素個數(長度 ln)單調不減。
基於此性質,我們可以維護一個變數 ln 表示「上一次清空所需的長度」,並在推進過程中猜測下一次的長度。
核心策略
由於長度 ln 只會變大,且通常變化緩慢,我們可以按以下優先順序檢查:
- 當前長度
ln是否仍足夠? 如果足夠,則盡可能連續跳躍。 - 長度
ln + 1是否足夠? - 長度
ln + 2是否足夠? - 二分搜尋: 如果以上皆非,說明長度劇烈增加,使用
lower_bound尋找新的ln。
為了進一步優化「當前長度 ln 足夠」的情況,我們引入根號分治的思想:
- 小片段 (
ln < B):- 當
ln很小時,簡單的線性跳躍可能會導致次數過多(例如 很小,ln=1,需要跳 次)。 - 此時利用 二分搜尋 找出「能連續用長度
ln跳躍的最大次數」,一次性更新位置。
- 當
- 大片段 (
ln >= B):- 當
ln很大時,剩餘的跳躍次數必然很少(最多 次)。 - 直接線性模擬(一步一步跳)即可,省去二分搜尋的開銷。
- 當
這裡的塊大小 取值約為 以平衡二分搜尋與線性模擬的成本。
深入解析:兩次二分搜尋的單調性基礎
這道題巧妙地在兩個不同的維度上使用了二分搜尋,且各自依賴不同的單調性:
-
針對「長度
ln」的二分搜尋 (策略 4)- 目的:當
ln劇烈變化時,尋找新的滿足條件的最小長度。 - 依賴單調性:前綴和的單調遞增。
- 給定起點 ,函數 隨 單調遞增。因此可用
lower_bound找到第一個 的位置,確定新的長度。
- 目的:當
-
針對「跳躍次數」的二分搜尋 (策略 1 - 小片段)
- 目的:當
ln很小且固定時,找出能連續跳躍的最大次數。 - 依賴單調性:滑動窗口和的單調遞減。
- 考慮起始於 、長度皆為
ln的連續 個片段,其總和分別為 。 - 由於數列 非遞增 (),對於任意偏移量 ,都有 。這導致 。
- 這種「越後面的片段總和越小」的性質,保證了若第 個片段滿足 ,則前 個片段必然也滿足,從而允許我們對 次數 進行二分搜尋。
- 目的:當
複雜度分析
複雜度推導
主要開銷在找尋新的 ln 以及跳躍時發生的二分搜尋:
1. 找尋新的 ln 時,最壞情況是長度變化劇烈,每次都需要二分搜尋:
設二分搜尋發生次數為 ,每次找到的新長度分別為 。
由於啟發式檢查處理了 的情況,觸發二分搜尋意味著長度至少增加了 。
因此長度序列大致為 。
總長度限制:。
近似解 。
這部分的總複雜度約為 。
2. 跳躍時發生的二分搜尋:
- 當 時,我們花費 進行二分跳躍。
- 當 時,我們花費 進行線性跳躍,最多跳 次。
總複雜度約為 。
為了平衡 (小片段二分成本) 與 (大片段線性成本),取 ,即 。
最終時間複雜度約為 。
- 時間複雜度:
- 空間複雜度: (僅需前綴和陣列)
1 | import math |
寫在最後
PROMPT
這裡什麼都沒有。
本部落格所有文章除特別聲明外,均採用CC BY-NC-SA 4.0 授權協議。轉載請註明來源 十六個天亮!
評論
WalineGiscus







