計算幾何 凸包 SCOI2007最大土地面積

2021-08-15 16:08:49 字數 2555 閱讀 5443

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

的多邊形面積最大。

n<=2000

比較基礎的計算幾何**複習題(誤)

首先,很容易證明一點:

所選擇的點一定位於凸包上。

因為如果存在最大四邊形使得點不全在凸包上,可以將不在凸包上的點外延,得到更大的凸包:

如下圖:

所選擇的四邊形中:左上角的點不在凸包上,那麼如果那個點選擇黃色區域的任意一點,都可以得到乙個更大的凸包:

很顯然,這個四邊形就不可能是最大的。

得到這個性質以後,我們選擇的範圍大大縮小,不過數量級沒有變化。

再來研究求解的過程:

一種很巧妙的思路是,暴力列舉兩個凸包上的點作為四邊形的對角線,再在這條線兩側各選擇乙個點,使得該點與這條線所構成的三角形面積盡量大。

這樣做的優點是:可以將問題分解為兩個互不干擾的相同的子問題,使問題變得簡單。

接下來有兩種方法:

solution a:

不難發現,如果要在某一側選乙個點,使得該點與這條線構成的三角形面積最大:假設這條線為底,因為這條線的長度已經確定,我們只需要使得它的高盡量大即可。

很容易發現:在凸包上,這樣的點組成的高線長是乙個單峰函式。所以只要在這些點中三分,就可以在o(

logn

) o(l

ogn)

複雜度內找到最遠點。

總的複雜度為o(

n2lo

gn) o(n

2log

n)//不過我寫都沒寫這種方法。

solution b

繼續研究這個單峰函式:

假設:能夠使列舉的對角線在有一公共點的情況下有序列舉(如圖)。

在這種情況下,結合之前的結論(單峰函式),我們會發現一點:對於這些線,所有的波峰的取值也是有序的(如圖)

對應關係:

1-d,2-d,3-e,4-f,5-f

有了這個性質,我們就不用再三分了。

我們根據上一次的波峰,比較它與它靠後乙個點,與新的線所組成的三角形面積的大小。這樣一來,複雜度也降低了,總的複雜度:o(

n2) o(n

2)這個思路看似十分巧妙,其實是根據旋轉卡殼的實現思路轉化而來的,如果看作是為旋轉卡殼作思想準備,這是一道不錯的好題。

除此之外,這就是一道不折不扣的計算幾何**複習題了

#include

#include

#include

#include

#include

#define sf scanf

#define pf printf

#define maxn 2010

using

namespace

std;

struct node

node(double xx,double yy):x(xx),y(yy) {}

node operator + (const node &a) const

node operator - (const node &a) const

node operator * (const

double &t) const

double

operator *(const node &a) const

double

operator ^(const node &a) const

bool

operator

< (const node &a) const

s.push(s1.top());

s1.push(p[i]);

}while(!s1.empty())

while(!s.empty())

s.pop();

}double sum(node a,node b,node c)

bool cmp(node a,node b)\n",l1[i].x,l1[i].y);*/

/*node t1=node(0,0);

node t2=node(1,1);

node t3=node(2,0);

pf("\n",sum(t1,t2,t3));*/

for(int i=1;i<=cnt1;i++)

}pf("%.3lf",ans);

}

計算幾何 凸包

有多個手機訊號發射器,求解乙個最小區域,要求所有的發射器都包含在這個最小區域中,並且任意兩台發射器之間的交流包含於在這個區域內。將所有的發射器看做為點,任意兩個點之間的連線都包含於乙個平面s 乙個平面的子集s 是凸的,當且僅當 s中的任意兩個點之間的連線都包含於 s中。點集 p的凸包是所有包含 p的...

計算幾何 凸包

如求凸包周長 include include include include include include using namespace std define pi 3.1415926 define eps 1e 10 class point 建立point類,裡面包含很多point的運算子 定...

計算幾何 凸包

凸多邊形 任意兩個頂點的連線都在多邊形內部,這樣的多邊形稱為凸多邊形 凸包的定義 乙個凸多邊形的頂點的集合 求凸包的一般形式 給出乙個點集,求出覆蓋所有點的最小凸多邊形 graham演算法 時間複雜度 o nlogn 極角排序耗時 先取出乙個端點,必須為凸包上的乙個點,取最下且最右的點即可 以端點進...