ABC344G 筆記

CTHOOH發表於2024-03-10

題意

給定 \(N\) 個二維平面上的點 \((X_i, Y_i)\)\(Q\) 組詢問,每組詢問給出一條直線 \(Y = A_iX + B_i\),問有多少個點在直線上方(或者在直線上)。也就是詢問有多少個 \((X_i, Y_i)\),滿足 \(Y_i \ge A_j \times X_i + B_j\)

題解

首先這個式子是 \(A \times X + B \le Y\),移項得 \(-A \times X + Y \ge B\)。那麼,假設每組詢問的 \(A\) 相等,那麼把 \((X, Y)\)\(-A \times X + Y\) 排序,然後二分答案即可。而對於 \(A\) 不同的情況,沿用剛才的方法,考慮維護這個排序後的序列(記為 \(B\))。

這個序列顯然不能線上維護,考慮離線。離線後對 \(Q\) 個詢問按 \(A\) 從大到小排序,思考 \(A\) 變小後,序列會發生什麼變化。也就是對於兩個點對 \((X_i, Y_i), (X_j, Y_j)\) 且在序列 \(B\) 中有 \(i < j\),原本存在關係 \(-A_1X_i + Y_i \le -A_1X_j + Y_j\),移項得 \(-A_1(X_i - X_j) + (Y_i - Y_j) \le 0\)。在 \(A_1\) 變成 \(A_2\) ( \(A_2 \le A_1\) ) 後,如果 \(i\) 被放到 \(j\) 的後面,就存在 \(-A_2(X_i - X_j) + (Y_i - Y_j) \ge 0\),孤立 \(A_2\) 之後得到 \(A_2 \le \frac{Y_i - Y_j}{X_i - X_j}\),而 \(\frac{Y_i - Y_j}{X_i - X_j}\) 其實就是 \((X_i, Y_i)\)\((X_j, Y_j)\) 兩點所連直線的斜率。

然後這道題就可以做了。首先將詢問按 \(A = +\infty\) 時的 \(-AX_i + Y_i\) 排序,其實就是將 \(X_i\) 按從大到小排序,\(X_i\) 相等時將 \(Y\) 從小到大。接著開一個小根堆存任意兩點的斜率。一個一個詢問往後掃,每次掃到一個新詢問,看一下小根堆存的斜率裡面有沒有可以被更新順序的。然後對 \(B_i\) 二分就行了。複雜度 \(O(Q \log N + N^2 \log N)\),這題時限 10s 可以過。

code: