很郁悶的一題,第一次碰到使用不同的編譯器,一個超時(C++),一個AC的情況(G++)。。。


首先題中的要求等價于:存在一條直線l和所有的線段都相交。

證明:若存在一條直線l和所有線段相交,作一條直線m和l垂直,則m就是題中要求的直線所有線段投影的一個公共點即為垂足。(l和每條線段的交點沿l投影到m上的垂足處)反過來,若存在m,所有線段在m上的投影有公共點,則過這點垂直于m作直線l, l一定和所有線段相交。

然后證存在l和所有線段相交等價于存在l過某兩條線段的各一個端點且和所有線段相交。充分性顯然。必要性:若有l和所有線段相交,則可保持l和所有線段相交,左右平移l到和某一線段交于端點停止(“移不動了”)。然后繞這個交點旋轉。也是轉到“轉不動了”(和另一線段交于其一個端點)為止。這樣就找到了一個新的l。

于是本題可歸結為枚舉兩兩線段的各一個端點,連一條直線,再判斷剩下的線段是否都和這條直線有交點。

注意:數據中有所有線段都縮成一個點的情況。