BZOJ 1069 凸包 旋轉卡殼

2022-05-20 06:15:24 字數 1630 閱讀 1939

在某塊平面土地上有n個點,你可以選擇其中的任意四個點,將這片土地圍起來,當然,你希望這四個點圍成

的多邊形面積最大。

第1行乙個正整數n,接下來n行,每行2個數x,y,表示該點的橫座標和縱座標。

最大的多邊形面積,答案精確到小數點後3位。

50 0

1 01 1

0 10.5 0.5

1.000

資料範圍 n<=2000, |x|,|y|<=100000

【分析】

這個叫旋轉 qia 殼?

好吧,去偷個gif回來。。

其實還是形象生動,旋轉卡殼是算點到線段的距離的,就是兩條線掃啊掃,有點單調的意思。

這題裡,列舉四邊形的對角線,然後兩邊找離這條線段的最遠的點,可以證明這些點都是在凸包上的(好像很明顯??)

就直接在凸包上找,假設已經列舉了線段x-y,現在列舉x-y+1,卡殼線不斷逆時針旋轉就可以了(我的打法是逆時針旋轉),因為前面去掉的點以後肯定也沒有用的,嗯。。

然後,這裡要用到平面差積,差積的值是有正負的,所以用差積算面積的時候要小心一點。然後也是用差積比較斜率的。。

1 #include2 #include3 #include4 #include5 #include6

using

namespace

std;

7#define maxn 201089

intn;

1011

const

double eps=0.000001;12

struct pa[maxn],c[maxn];

13int

len;

1415

double mymax(double x,double y)

16double myabs(double x)

1718 p operator -(p x,p y)

1924

25int dcmp(double

x)26

30bool cmp(p x,p y)

31double dot(p x,p y)

32double cross(p x,p y)

3334

void

chull()

3543

int k=len;

44for(int i=n-1;i>=1;i--)

4549 len--;50}

5152

double ans=0;53

void rc()//

rotating calipers

5466}67

}686970

intmain()

7177

chull();

78rc();

79 printf("

%.3lf\n

",ans/2

);80

return0;

81 }

view code

2016-12-10 09:44:52

有一篇很好的講旋轉卡殼的博:

bzoj1069 凸包 旋轉卡殼

問題 在若干個點中取四個點,求圍成的四邊形的最大面積。思路 先求個凸包,n 2 列舉對角線,然後旋轉卡殼o 1 更新左右邊界即可。include include include include include include include include include include inclu...

BZOJ 1069 求凸包 旋轉卡殼

思路 求凸包 先按照x軸排個序 從左往右掃一遍 找到上凸殼 用叉積 再從右往左掃一遍 求下凸殼 搞個旋轉卡殼就好啦 嗯 我手懶 用的c complex庫 巨好用!by siriusren include include include using namespace std define cplex...

BZOJ 1069 求凸包 旋轉卡殼

思路 求凸包 先按照x軸排個序 從左往右掃一遍 找到上凸殼 用叉積 再從右往左掃一遍 求下凸殼 搞個旋轉卡殼就好啦 嗯 我手懶 用的c complex庫 巨好用!by siriusren include include include using namespace std define cplex...