【LuoguP5328】[ZJOI2019]浙江省選

題目鏈接

題意

給你一堆斜率和縱截距都爲正的直線 ,求對於一個條直線是否存在一個 x 使得在這條直線在 x 處能是前 m 大,輸出最高能夠達到的排名(排名定義爲在 x 處嚴格大於自己的直線條數+1) ,如果不能輸出 -1。

n105,m20n\leq 10^5 , m\leq 20

Sol

一道思路不算太難但寫起來很煩人的題。

對於 m=1m=1 ,我們發現這個就是 [HNOI2008]水平可見直線 那一題 ,唯一要注意的是直線露出的部分上必須有 x 爲整數的點。

發現 mm 很小,考慮從小往大處理。
一個比較直觀的想法就是把可能排第一的直線全部刪掉重新做一次半平面交。
然後我們取出再次能排在第一位的直線,發現這個時候直線合法就相當於是之前被刪掉的直線中在當前這條直線露出部分上面的條數不超過 k1k-1 條 (k爲當前處理的答案)

因爲我們只需要做 mm 次半平面交,所以我們即使每次用 O(n)O(n) 的複雜度判斷也沒事。
於是直接暴力地拿出之前所有被刪掉的直線,算出與當前半平面的最左和最右的交點,顯然中間的直線都被覆蓋一次,差分一下就行了。
看上去很簡單,但是細節如 : 精度問題(寫個帶分數避免),直線上必須有x座標爲整數的點 等等蛇皮問題讓人寫起來很不爽。

於是代碼就不放了。( 因爲是抄別人的。)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章