BZOJ1069 最大土地面積 凸包 旋轉卡殼

2021-08-11 20:31:47 字數 1796 閱讀 3607

bzoj1069傳送門

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

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

輸入格式:

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

輸出格式:

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

直接講做法吧

很容易腦補出來,如果要面積最大,四邊形的頂點一定都在凸包上

(不要問me凸包只有三個點的情況…me也不是很清楚,不過貌似沒有這樣的資料)

用單調棧維護出凸包之後,在凸包上列舉兩個點的連線作為四邊形的對角線,然後在對角線兩邊分別找面積最大三角形

很明顯在固定兩個點之後,另外兩個點也是有單調性的,時間複雜度θ(

n2)

關於最大四邊形四點一定在凸包上的正確性,如果有乙個點在凸包內,那麼< 對角線-當前頂點 >三角形的面積一定是比< 對角線-凸包頂點 >三角形的面積小的,畫個圖就會明白了

#include 

#include

#include

#include

using

namespace

std ;

const

double eps = 1e-13 ;

int n , topp ;

struct vector ;

vector( double x_ , double y_ ):

x(x_) , y(y_){} ;

double len()

} ;typedef vector point ;

point a[2005] , poly[2005] ;

int dcmp( double x )

vector operator + ( const vector &a , const vector &b )

vector operator - ( const vector &a , const vector &b )

vector operator * ( const vector &a , const

double &p )

vector operator / ( const vector &a , const

double &p )

bool

operator == ( const vector &a , const vector &b )

bool

operator

< ( const point &a , const point &b )

double

fabs ( double x )

double dot ( const vector &a , const vector &b )

double cross( const vector &a , const vector &b )

void convex( point *a , int siz , point *p , int &topp )

int las = topp ;

for( int i = siz - 1 ; i >= 1 ; i -- )

topp -- ;

/* for( int i = 1 ; i <= topp ; i ++ )*/}

double ans ;

void rc()

}printf( "%.3f" , ans/2 ) ;

}int main()

BZOJ 1069 最大土地面積

給出平面上的一些點,找出四個點使這四個點圍成的面積最大。首先這四個點肯定在凸包上 顯然。所以求出凸包後 n 地列舉乙個點,之後利用旋轉卡殼求出與這個點相距最遠的點,然後列舉所有點找出兩邊三角形的最大面積取最大即可。這題主要是板子吧,背會就好背會就好 include include include i...

bzoj 1069 最大土地面積

題目大意 一些點,選四個點使這圍成的四邊形面積最大 思路 首先可以知道這些點一定在凸包上,然後graham求一下凸包 然後我們可以列舉對角線在兩邊找最遠的點 然而這樣複雜度爆了 所以我們可以利用旋轉卡殼的思想 列舉對角線的時候確定乙個點,然後旋轉另乙個點,如果確定了另外兩個點,則另外兩個點也一起轉 ...

bzoj1069 最大土地面積

在某塊平面土地上有n個點,你可以選擇其中的任意四個點,將這片土地圍起來,當然,你希望這四個點圍成 的多邊形面積最大。第1行乙個正整數n,接下來n行,每行2個數x,y,表示該點的橫座標和縱座標。最大的多邊形面積,答案精確到小數點後3位。50 0 1 01 1 0 10.5 0.5 1.000 資料範圍...