N×N 棋盤,放 N 個車(Roak),互不攻擊(每行每列恰好一個)。第 i 個車只能放在矩形 [lx_i, rx_i] × [ly_i, ry_i] 內。求任意可行放置方案或判定無解。
車不攻擊 ⇔ 所有車的 x 坐標互不相同,y 坐標互不相同。
x、y 兩維度**完全獨立**,可分別求解!
問題轉化為:在 1 維線上,有 N 個區間 [l_i, r_i],每個區間選一個整點,所有選點互不相同。這是經典**區間調度/貪心**問題。
l 將區間分桶:bucket[l] 存所有 l_i = l 的區間索引。x = 0..N-1:bucket[x] 所有區間加入**最小堆**,按右端點 r 排序。r < x → 無解。x 給它。
bool solve1D(int* l, int* r, int* ans) {
vector bucket[N];
for (int i=0;i, vector>, greater<>> pq;
for (int x=0; x
經典「最早截止時間優先」貪心:當前坐標 x 必須分配給某個覆蓋 x 的區間。選擇 r 最小的區間,為後續留出最大餘地。交換論證可證最優。
排序/分桶 O(N),堆操作 O(N log N),總 O(N log N),N ≤ 5000 輕鬆通過。