Luogu 🟡 P3029 [USACO11NOV] Cow Lineup S
題目的難度顏色使用 Luogu 上的分級,由簡單到困難分別為 🔴🟠🟡🟢🔵🟣⚫。
🔗 P3029 [USACO11NOV] Cow Lineup S
Problem Statement
題目簡述
在數線上給定 N 頭奶牛,每頭有座標 與顏色 。
求最短的區間長度 ,使得該區間涵蓋所有不同顏色的奶牛至少一頭。
Constraints
約束條件
思路:滑動窗口(值域 → 離散化)
核心問題
給定數線上的點(座標)與顏色,找一個最短區間,涵蓋所有顏色的點至少一次。
初步想法:從「值域滑動窗口」開始
如果座標範圍很小(例如最大值不超過 ),最直接的想法是:
- 建立一個陣列,長度等於座標最大值,記錄每個座標上的顏色集合(可能有多頭同座標的牛)
- 使用雙指標
L與R在值域上滑動,維護一個計數器記錄當前窗口內各顏色的出現次數 - 當涵蓋顏色數等於總顏色數 時,記錄長度
R - L,並嘗試收縮左邊界
這種做法的時間複雜度為 ,其中 是座標最大值, 是顏色點的數量。當 高達 時完全不可行——這也是本題的限制所在。
優化:離散化後僅考慮「有牛的座標」
由於我們只關心有牛的座標,而牛的數量 ,可以把所有有牛的座標取出排序,然後在排序後的座標列表上進行滑動窗口,而非在整個值域上移動。
關鍵洞察
區間長度只會在兩個有牛的座標之間變化。移到沒有牛的空白區域不會改變涵蓋的顏色集合,只會徒增長度,所以最優解一定以某個有牛的座標作為左右端點。
處理相同座標多頭牛
在同一個座標上可能有多頭不同顏色的牛。加入窗口時必須一次加入該座標的所有顏色,移除時也必須全部移除,因為窗口邊界只能落在座標位置上,不能切開同一座標內的不同牛。
複雜度分析
- 時間複雜度:
- 根據坐標排序 頭牛需要 時間,滑動窗口需要 時間。
- 空間複雜度:
Code
1 | from collections import defaultdict |
本部落格所有文章除特別聲明外,均採用CC BY-NC-SA 4.0 授權協議。轉載請註明來源 十六個天亮!
評論
WalineGiscus




![Luogu 🟡 P3029 [USACO11NOV] Cow Lineup S](https://i.gdst.dev/cover/P3029.webp)
![Luogu 🟢 P4552 [Poetize6] IncDec Sequence](https://i.gdst.dev/cover/P4552.webp)
![Luogu 🟢 P2882 [USACO07MAR] Face The Right Way G](https://i.gdst.dev/cover/P2882.webp)
![Luogu 🟡 P1083 [NOIP 2012 提高组] 借教室](https://i.gdst.dev/cover/P1083.webp)
![Luogu 🔵 P3017 [USACO11MAR] Brownie Slicing G](https://i.gdst.dev/cover/P3017.webp)
![Luogu 🟢 P1314 [NOIP 2011 提高组] 聪明的质监员](https://i.gdst.dev/cover/P1314.webp)




