original link -
題意:
求最遠點對
推薦
解析:
對踵點定義:多邊形的兩個位於平行切線上的點。
我們可以通過旋轉卡殼o(n
)o(n)
o(n)
得出所有點對應的對踵點。(先處理凸包)
旋轉卡殼
當我們順時針列舉點的時候,這些點的對踵點應該也是順時針的,所以我們以此列舉即可。
顯然對踵點到這條邊的距離最長,也就是說形成的三角形面積最大,所以我們可以用叉積來判斷對踵點。
**:
#include
#include
#include
#include
#include
#include
#include
using
namespace std;
const
int maxn=
5e4+9;
const
double eps=
1e-7
;struct point};
typedef point p;
typedef point point;
typedef point vector;
vector operator
+(vector a, vector b)
vector operator
-(vector a, vector b)
vector operator
*(vector a,
double p)
vector operator
/(vector a,
double p)
intdcmp
(double x)
bool
operator==(
const point &a,
const point &b)
double
cross
(p a,p b)
double
lengthpow
(vector v)
double
distance
(p a,p b)
point p[maxn]
,ans[maxn]
;int n,top;
point tmp;
//選好的起點
bool
cmp(point a,point b)
// 去掉共線點
void
graham
(point p,
int n,point ans,
int&top)
for(
int i=
2;i<=n;i++
) tmp=p[1]
;sort
(p+2
,p+1
+n,cmp)
; ans[1]
=p[1
],ans[2]
=p[2
],top=2;
for(
int i=
3;i<=n;i++)}
#define rep(i,a,b) for(int i=a;i<=b;i++)
double
rotatecalipers
(p *p,
int n)
return ans;
}int
main()
graham
(p,n,ans,top)
;printf
("%.0f\n"
,round
(rotatecalipers
(ans,top)));}}
凸包 旋轉卡殼 平面最遠點對
題目描述 給定n個點求平面最遠點對 n 50000 題解 嘛。自己想練練手才寫上來的。不過 沒問題的啦 就是像我在計算幾何學習筆記 中說的一樣 先求凸包再旋轉卡殼求就行了 複雜度nlogn 資料可以再大一點的2333 by 減維 include include include include inc...
POJ2187 旋轉卡殼求平面最遠點對
分類 計算幾何 2013 02 12 15 23 62人閱讀收藏 舉報旋轉卡殼可以用於求凸包的直徑 寬度,兩個不相交凸包間的最大距離和最小距離等。深度學習旋轉卡殼這裡 題目 beauty contest cpp view plain copy include include include usin...
poj 2187 旋轉卡殼(平面上最遠點對)
題意 給定二維平面上不超過50000個點,求最遠點對距離的平方。思路 由資料量來判斷直接列舉會超時。注意到最遠距離點對必出現在這些點的凸包上,所以可以先求出凸包,然後在凸包上列舉。此法的最壞情況複雜度仍然是n 2的,但是可以ac這道題了。在複雜度意義下的優化是旋轉卡殼 參考 如果qa,qb是凸包上最...