CF1190E Tokitsukaze and Explosion 二分、貪心、倍增、ST表


傳送門


最小值最大考慮二分答案,不難發現當最小值\(mid\)確定之后,原點到所有直線的距離一定都是\(mid\)時才是最優的,也就是說這些直線一定都是\(x^2+y^2=mid^2\)的切線。

接下來考慮一個點會被哪些切線所保護。作出這個點到圓的公切線,得到兩個切點,那么在這兩個切點之間的優弧上選擇一個點,以它為切點的切線就可以保護當前點。也就是說能夠保護一個點的切線的切點在圓上表現為一段角度的區間。可以用解析幾何計算出這個角度的區間。

接下來需要在\([-\pi , \pi]\)上選擇不超過\(M\)個點使得所有區間都被包含,但是區間在環上不太好做。考慮斷環成鏈,將每個角度區間復制一份,左右端點均增加\(2\pi\),這樣我們只需要在數軸上選擇\(M\)個點滿足按照左端點排序之后連續的\(N\)個區間都包含了至少一個點。

設某個方案中選擇的數軸上最左邊的點能夠影響的最左的區間為\(p\)。我們枚舉\(p\),然后貪心地向后選點。設\(f_p\)表示最大的\(r\)滿足\([p,r)\)的所有區間有交,這個可以二分+ST表維護。那么我們選點一定會選擇將\([p,f_p)\)覆蓋,然后就到達了以\(r\)為最左區間的問題。那么如果\(f^M_p=f_{f_{...f_{p}}} \geq p + N\),那么當前的二分值就是合法的。

我們維護一個倍增數組\(jump_{p,x}\)表示\(f^{2^x}_p\),這樣就可以在\(O(logN)\)的復雜度內check以\(p\)為鏈起點是否滿足條件。

值得注意的一個細節是在上述轉換之后,在第二步內求出的區間原本因為要在\([-\pi,\pi]\)內所以要拆成兩段,但斷環成鏈之后就不需要了。只是右端點可以不在\([-\pi , \pi]\)內,但是左端點一定要在\([-\pi , \pi]\)之內,否則可能出現連續的一段區間中包含了兩個來自同一個點的區間的情況。這東西很難拍,下面有一個樣例QAQ

6 3
42627 44146
-20187 70146
-37387 7977
-90009 -46598
-31234 -47643
45206 -23994

Code


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM