目前最好的兩篇文章:
dp 小計 wqs 二分 - g1ove - 部落格園 (cnblogs.com)
【學習筆記】WQS二分詳解及常見理解誤區解釋-CSDN部落格
後面的用來理解基本做法,前面的用來解釋問題。
關於用小數,答案是不用的。整數一定能切到 \(k\),只是沒法表示出來。
設一個斜率 \(c\) 可以直接切到 \(k\) 和 \(k + 1\) 點(即兩點連線的斜率),那麼有 \(c = \frac{g(k + 1) - g(k)}{(k + 1) - k} = g(k + 1) - g(k)\) 其中 \(g(k)\) 和 \(g(k + 1)\) 一定都是整數,所以 \(g(k + 1) - g(k)\) 一定也是整數,所以 \(c\) 一定是一個整數。
因為這個斜率是直接切到 \(k\) 和 \(k + 1\) 點,所以整數一定可以切到 \(k\),但因為選取的順序,所以可能最後返回的點不是 \(k\),而是 \(k + 1\),或者因為多點共線,導致表面上切不到 \(k\) 點,(即不返回 \(k\))。某些部落格裡面說的:切出來的直線的斜率 \(k\) 在一個範圍 \([k_l,k_r]\) 內都是落在同一個 \(x\) 點上,應該就是表達的這種證明。
即使是共線,因為斜率還是那個斜率,可以切到 \(k\) (只是表面上不返回 \(k\)),所以正常求 \(g(x)\) 即可。但要注意,因為選取傾向不同,共線選到的點也不同,二分的傾向也就不同(即二分封左/右)。這句話比較抽象(應該沒有部落格能講出來)。做做這題 P2619 [國家集訓隊] Tree I - 洛谷 | 電腦科學教育新生態 (luogu.com.cn) 勇敢一點,應該就能理解這句話。