link
模板乙個。其實感覺說是求凸包的直徑倒不如說是求平面內最遠點對,畢竟它的輸入沒保證是個凸包,自己還要再求一遍啊……
旋轉卡殼的思想十分優雅易懂,就是先證明平面內最近點對一定是凸包上兩點,再根據這個結論,列舉每一條邊的同時找出離線段最遠的點並更新答案即可。為了盡可能地降低找點的複雜度,對問題進行分析。容易發現距離是單峰的,所以可以用三分查詢來做;但事實上沒有必要,因為會發現按順序列舉邊的過程中決策點是單調不降的,所以可以直接用高階決策單調性來解決。演算法複雜度的瓶頸是凸包部分的排序,故複雜度為 \(o(nlogn)\) 。
有一些小bug。有可能凸包上只有兩個點,這就會導致永遠都找不到離線段最遠的點而死迴圈,特判即可。另外凸包的邊上不應該有點,否則會造成一些錯誤。
#include#include//#define zczc
using namespace std;
const int n=50010;
inline void read(int &wh)
while(w>='0'&&w<='9')
wh*=f;return;
}inline int max(int s1,int s2)
for(int i=1;i1&&!check(st[top],a[i],st[top-1],st[top]))top--;st[++top]=a[i];
} for(int i=top;i>1;i--)s[++cnt]=st[i];
s[++cnt]=s[1];m=cnt;
if(m<=3)
//求直徑
for(int i=1,last=1;iprintf("%d\n",ans);
return 0;
}
旋轉卡殼部分模板
凸包直徑 旋轉卡殼凸包直徑詳解 計算凸包直徑,輸入凸包ch,頂點個數為n,按逆時針排列,輸出直徑的平方 int rotating calipers int n return ans 凸包間最小距離 struct point 建構函式 方便 編寫 p n q n typedef point point...
模板 凸包 旋轉卡殼
模板 凸包 旋轉卡殼 lrj 訓練指南 p272 對於個點按照 x 從小到大排序,再按照 y 點從小到大排序,刪除重複的點後,得到序列 p0,p1,p2.把 p0 和 p1 放入凸包。從p2開始,當新點在凸包 前進 方向的左邊時繼續,否則依次刪除最近加入凸包的點,直到新點在左邊 ps 判斷用叉積即可...
洛谷1452 模板 旋轉卡殼
點此看題面 一些基礎的定義 例如切線 對踵點之類的 就懶得寫了。據說旋轉卡殼一般來說都有兩種寫法,而我自然選擇的是其中相對簡單的那一種。考慮如果我們找到了最優狀態下的一對切線,把它們同時旋轉到與這兩個點的某一條鄰邊相切,那麼對面的那個點,必然是與這條邊距離最大的點。然後就可以發現乙個很好的性質,凸包...