洛谷1452 模板 旋轉卡殼

2022-09-14 17:51:20 字數 927 閱讀 7396

點此看題面

一些基礎的定義(例如切線、對踵點之類的)就懶得寫了。

據說旋轉卡殼一般來說都有兩種寫法,而我自然選擇的是其中相對簡單的那一種。

考慮如果我們找到了最優狀態下的一對切線,把它們同時旋轉到與這兩個點的某一條鄰邊相切,那麼對面的那個點,必然是與這條邊距離最大的點。

然後就可以發現乙個很好的性質,凸包上每個點與一條邊的距離是滿足先增後減的,也就是具有單調性。

而且,如果我們按順序列舉每一條邊,最遠的那個點必然是滿足單調移動的。

因此我們只要在列舉邊的同時利用雙指標維護好最遠的點就可以做到\(o(n)\)複雜度了(然而求凸包的複雜度是\(o(nlogn)\)的)。

在邊確定的時候,要比較距離的大小,其實可以比較與這條邊一起構成的三角形面積的大小,直接叉積計算即可。

#include#define tp template#define ts template#define reg register

#define ri reg int

#define con const

#define ci con int&

#define i inline

#define w while

#define n 50000

using namespace std;

int n;struct p

i p operator + (con p& o) con

i p operator - (con p& o) con

i int operator ^ (con p& o) con

i bool operator < (con p& o) con

i void rotate()//旋轉卡殼

printf("%d\n",t);

}int main()

模板 旋轉卡殼

link 模板乙個。其實感覺說是求凸包的直徑倒不如說是求平面內最遠點對,畢竟它的輸入沒保證是個凸包,自己還要再求一遍啊 旋轉卡殼的思想十分優雅易懂,就是先證明平面內最近點對一定是凸包上兩點,再根據這個結論,列舉每一條邊的同時找出離線段最遠的點並更新答案即可。為了盡可能地降低找點的複雜度,對問題進行分...

旋轉卡殼部分模板

凸包直徑 旋轉卡殼凸包直徑詳解 計算凸包直徑,輸入凸包ch,頂點個數為n,按逆時針排列,輸出直徑的平方 int rotating calipers int n return ans 凸包間最小距離 struct point 建構函式 方便 編寫 p n q n typedef point point...

洛谷3187 最小矩形覆蓋(旋轉卡殼)

這道題瞄了眼題解才知道怎麼做的。關於為什麼最後最優矩陣有一條邊在凸包上,emmm,留坑待證。有了上面這個結論,這道題就over了,先求凸包,再旋轉卡殼找最小矩陣 左右點積,上方叉積 精度簡直被卡的想吐 0.00000是什麼?蛤?有毒吧?include include include includec...