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 判斷用叉積即可...