LA 4728凸包演算法 旋轉卡殼的直徑

2022-09-15 22:39:19 字數 1873 閱讀 9857

1

/*la 4728

2凸包演算法-旋轉卡殼的直徑

3沒有其他技巧,可作為模板運用

4注意operator< 中精度的處理,不然會出錯5*/

6 #include 7 #include 8 #include

9 #include 10 #include 11 #include

12 #include 13 #include 14 #include 15 #include 16 #include 17 #include 18 #include 19 #include

20 #include 21

#define inf 0x3f3f3f3f

22#define ll long long

23#define eps 1e-7

24#define maxn 401000

25using

namespace

std;

2627

28struct

point

2932

point(ll xx,ll yy)

3337

bool

operator

<(const point& p) const

//注意:按照逆時針旋轉

3842

} p1[maxn],p2[maxn];

4344

typedef point vector;

4546

bool

operator==(point a,point b)

4751 vector operator-(point a,point b)//

表示a指向b

5255 vector operator*(vector a,double

k)56

59 vector operator+(point a,point b)//

表示a指向b

6063

double

cross(vector a,vector b)

6467

double

area2(point a,point b,point c)

6871

//p是原先點的陣列,n是個數,ch是凸包的點集

72//

精度要求高是用dcmp比較

73//

返回凸包點的個數

74int convexhull(point *p, int n, point* ch) //

求凸包75

83int k =m;

84for(int i = n-2; i >= 0; i--)

8589

if(n > 1) m--;

90return

m;91}92

//卡殼預備函式

93 ll cross( const point &o, const point &a, const point &b )

96 ll dist( const point & a, const point &b )

100//

計算凸包直徑,輸入凸包 ch,頂點個數為 n,按逆時針排列,輸出直徑的平方

101 ll rotating_calipers(point *ch,int

n)102

111return

ans;

112}

113int

t,n,cnt1,cnt2;

114int

main()

115130 cnt2=convexhull(p1,cnt1,p2);

131 cout132}

133return0;

134 }

LA 4728 旋轉卡殼 Squares

題意 求平面上的最遠點對距離的平方。分析 對於這個資料量列舉肯定是要超時的。首先這兩個點一定是在凸包上的,所以可以列舉凸包上的點,因為凸包上的點要比原來的點會少很多,可最壞情況下的時間複雜度也是o n2 於是就有了旋轉卡殼。可以想象有兩條平行直線緊緊地夾住這個凸包,那直線上的點就是對踵點對。對踵點對...

凸包掃瞄 旋轉卡殼 UVALive 4728

題意 給n個正方形,求正方形的頂點之間的最大距離。思路 可以確定的是最遠距離的2個點一定在這些正方形的頂點的凸包上的2個點。所以先求一次凸包。求凸包上2個點的最打距離,實際就是就凸包的直徑,有成型的演算法。可以用旋轉卡殼直接求解。include include include include inc...

凸包問題 旋轉卡殼

1978年,m.i.shamos在 computational ceometry 中介紹了一種尋找凸多邊形直徑的線性演算法。1.支撐線 如果一條直線l,通過凸多邊形p的乙個頂點,且多邊形在這條直線的一側,稱l是p的支撐線。2.對踵 zhong,三聲 點 如果過凸包上的兩個點可以畫一對平行直線,使凸包...