旋轉卡殼 POJ2079

2021-07-22 09:17:19 字數 3052 閱讀 3868

推介blog:

1.旋轉卡殼求凸包直徑:

如上圖:

我們定起始點為a,首先從a點開始你順時針找到凸包上距離a點最大距離的e點;

由於a到f的距離小於a到e的距離,此時我們旋轉線的左端點到b點,再去計算b到f的距離,之後旋轉線段的右端點,發現bg的距離小於bf,此繼續旋轉左端點到下乙個頂點。

每次旋轉卡殼的操作就是由乙個固定的左端點,和旋轉方向固定的右端點,求出其到乙個右端點的距離函式由上公升變為下降後,旋轉左端點,繼續計算距離,知道左端點再次回到a點的位置。

這樣我們每次操作相當於得出了每個點到凸包上其他點的最大距離,要求所有頂點之間的最大距離,只需從這些所有的最大距離中取最大值即可。

題意:

給出平面上n個點,求出這些點中距離最大的兩個點。

題解:

構建乙個凸包,通過旋轉卡殼求凸包的直徑。

**:

#include 

#include

#include

#include

using

namespace

std;

struct point

point operator -(const point &b)const

intoperator ^(const point &b)const

intoperator *(const point &b)const

void input()

};int dist2(point a,point b)

const

int maxn = 50010;

point list[maxn];

int stack[maxn],top;

bool _cmp(point p1,point p2)

void graham(int n)

swap(list[0],list[k]);

sort(list+1,list+n,_cmp);

if(n == 1)

if(n == 2)

stack[0] = 0;

stack[1] = 1;

top = 2;

for(int i = 2;i < n;i++)

}//旋轉卡殼,求兩點間距離平方的最大值

int rotating_calipers(point p,int n)

return ans;

}point p[maxn];

int main()

return

0;}

2.旋轉卡殼求凸包的寬

求凸包的寬時,通過列舉每條邊和頂點構成的三角形的最大面積的最小值實現。

如上圖:

先選取ab邊,然後通過計算三角形面積最大值的方式找到e點。

當發現順時針旋轉三角形頂點到f點後,三角形的面積值函式由上公升變為下降,此時旋轉底邊到bc,繼續求三角形面積。

每次通過列舉一條邊,由三角形面積函式的增減性的改變可以求出以這條邊為底邊的三角形的最大面積是由哪個頂點構成的,記錄此時三角形的高度。

對於所有邊的面積最大三角形的高度的最小值就是凸包的寬。

題意:

給出平面上一些點,求任選三個點,這些點能構成的三角形的面積最大值。

題解:

構建凸包,在旋轉卡殼求凸包的寬度時記錄最大值,即可計算得出答案。

**:

#include 

#include

#include

#include

#include

using

namespace

std ;

#define max 50005

struct point

point(int _x , int _y)

point operator - (const point &b) const

intoperator ^ (const point &b) const

intoperator * (const point &b) const

};struct line

line(point _s , point _e)

};int xmult(point p0,point p1,point p2) //叉積p0p1 x p0p2

int dist2(point a,point b)

point list[max] ;

int stack[max] , top ;

bool _cmp(point p1,point p2)

void anglesort(int n) //輸入,並把最左下方的點放在list[0],並且進行極角排序

}list[k]=list[0];

list[0]=p0;

sort(list+1,list+n,_cmp);

}void graham(int n)

}swap(list[k],list[0]);

sort(list+1,list+n,_cmp);

if(n == 1)

if(n == 2)

stack[0] = 0;

stack[1] = 1;

top = 2;

for(int i = 2;i < n;i++)

}int rotating_calipers(point p,int n)

}return ans;

}point now[max] ;

int main()

return

0;}

旋轉卡殼 半平面交板子 poj 2079

sampleinput 編輯3 3 42 6 2 75 2 63 9 2 08 0 6 5 1 sampleoutput 編輯0.50 27.00 pragma comment linker,stack 1024000000,1024000000 include include include in...

POJ 2079 旋轉卡殼求最大三角形面積

題目大意給你n n 50000 個點,求解任意三個點組成的三角形的最大面積。include include include include include using namespace std define max n 50010 define m pi 3.1415926535897932384...

poj 2187(旋轉卡殼)

傳送門 模板題,求凸包,用旋轉卡殼求出最遠點對。因為把int弄成double,wa了好幾次,差點對idy大神給的模板失去信心。不過事實證明idy的寫法沒問題,orz!include include include include include include using namespace std...