凸包模板 優化

2021-09-25 23:33:55 字數 3182 閱讀 5408

const

double eps =

1e-9

;struct point //儲存點

point

(int x,

int y):x

(x),

y(y)

point operator

-(point &b)

//重構減法

bool

operator

<

(point p)};

intsgn

(int d)

//判斷d的符號函式,d大於0返回1,小於0返回-1,等於0返回0

intdcmp

(double x,

double y)

//兩者想等返回0,x > y返回 1,x < y返回 0

//向量叉乘

double

cross

(point a, point b)

return a.x*b.y-a.y*b.x;

//向量點乘

double

dot(point a, point b)

return a.x*b.x + a.y*b.y;

bool

onsegment

(point p, point a1, point a2)

//三點共線原理判定

//多邊形有向面積,可以計算任意形狀多邊形

double

polygonarea

(vector p)

//p為端點集合,n為端點個數

//判斷點是否在多邊形內,若點在多邊形內返回1,在多邊形外部返回0,在多邊形上返回-1

intispointinpolygon

(point p,vector con)

// 二分效率高

else i=mid+1;

}if(line>0)

return

cross

(p-con[line-1]

,con[line]

-con[line-1]

)<

-eps;

return0;

}vector

convexhull

(vector p)

//求凸包

gym - 100941d

vjudge

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define llong long long

#define for(i,a,n) for(register llong i=a;i<=n;++i)

#define rf(i,a,n) for(register llong i=a;i>=n;--i)

#define maxn 100005

#pragma gcc optimize(2)

using

namespace std;

const

double eps =

1e-7

;inline

void

in(llong &x)

while

(c<=

'9'&&c>=

'0') x=

(x<<1)

+(x<<3)

+c-'0'

,c=getchar()

; x*

=y;}

struct point

point

(llong x, llong y):x

(x),

y(y)

point operator

-(point &b)

bool

operator

<

(point p)};

struct node

}a[maxn]

;llong n, pnum, m;

llong ans;

int flag[maxn]

;vector poly[maxn]

;inline llong sgn

(llong d)

inline llong cross

(point a, point b)

// ×乘

inline llong polygonarea

(vector p)

inline

bool

ispointinpolygon

(point p,vector con)

//二分判斷乙個點是否在凸包內

else i=mid+1;

}if(line>0)

return

cross

(p-con[line-1]

,con[line]

-con[line-1]

)<

-eps;

return0;

}inline vector

convexhull

(vector p, llong t)

intmain()

poly[i]

=convexhull

(poly[i]

, pnum)

;//返回的poly的size可能發生變化

a[i]

.mj =

polygonarea

(poly[i]);

//求面積

a[i]

.id = i;

}sort

(a+1

, a+n+1)

;in(m);

while

(m--

)else

}//注意不要重複計算面積

if(l != n+1&&

!flag[l]

) flag[l]=1

, ans+

=a[l]

.mj-a[l-1]

.mj;

}printf

("%0.6f\n"

, ans/

2.0)

;return0;

}

凸包模板題

poj 1113 這道題是凸包第一題,也是我學習演算法的一題。直接看了題解,看別人怎麼寫的然後自己模仿,寫出自己的凸包模板 這道題,直接凸包然後算個長度就可以了 include include include include includeusing namespace std struct poi...

凸包(Andrew演算法)模板

andrew演算法是graham的變種,相較graham,其更快,數值穩定性更好。藍書 struct nodep maxn ch maxn bool cmp node a,node b int cross node p0,node p1,node p2 凸包邊上可以有點,則 否則 int conve...

模板 凸包 旋轉卡殼

模板 凸包 旋轉卡殼 lrj 訓練指南 p272 對於個點按照 x 從小到大排序,再按照 y 點從小到大排序,刪除重複的點後,得到序列 p0,p1,p2.把 p0 和 p1 放入凸包。從p2開始,當新點在凸包 前進 方向的左邊時繼續,否則依次刪除最近加入凸包的點,直到新點在左邊 ps 判斷用叉積即可...