N 輛賽車在無限長直線上,第 i 輛車初始位置 k_i,速度 v_i(恆定)。若某車曾處於領跑位置(無其他車在其前方),則獲獎。求所有獲獎車輛編號(從小到大)。
車輛位置隨時間 t 變化:x_i(t) = k_i + v_i * t。領跑條件:存在 t ≥ 0 使得 x_i(t) ≥ x_j(t) 對所有 j 成立。即直線 y = v_i * x + k_i 在 x ≥ 0 區間曾是上包絡線的一部分。
考慮 (v, k) 平面。車 i 領跑 ⇔ 存在 t ≥ 0 使 k_i + v_i t ≥ k_j + v_j t (∀j)。整理得:(v_i - v_j) t ≥ k_j - k_i。
綜合:車 i 獲獎 ⇔ max_{v_j < v_i} (k_j - k_i)/(v_i - v_j) ≤ min_{v_j > v_i} (k_j - k_i)/(v_i - v_j) 且該區間與 [0, +∞) 有交集。這等價於點 (v_i, k_i) 在所有直線 y = v_j x + k_j (x ≥ 0) 形成的上凸包上。
提供的 C++ 代碼實現上述邏輯,結構體 car 含 p, v, id。cmp 排序,cross 計算叉積。主循環雙重 while 維護凸包。最後收集棧中 id 排序輸出。注意 vector
本題將動態領跑問題轉化為靜態幾何問題,利用半平面交(上凸包)思想,通過單調棧線性求解,是計算幾何在算法競賽中經典應用。