三維凸包 BZOJ 最佳包裹

2021-09-28 17:09:54 字數 1438 閱讀 6943

模板題解

增量法怎麼這麼強啊。

擾動很重要,直接掛50分。

判斷可視邊緣的方法很神奇,將每個三角面的三邊順方向打有向標記,那麼只有乙個方向有邊的點對就是邊緣點對,直接建面。

總的面數是o(n

)o(n)

o(n)

,複雜度為o(n

2)

o(n^2)

o(n2

)可以用乙個有理有據但是有點麻煩的優化:

可以做到o(n

log⁡n)

o(n\log n)

o(nlogn)

a cc

od

e\rm

accode

#include

#define maxn 2005

#define eps 1e-11

using

namespace std;

int n;

#define db double

struct point

point operator-(

const point &b)

const

point operator*(

const point &b)

const

db operator^(

const point &b)

const

db nor()

}p[maxn]

;struct face

point nor()

db area()

}f[maxn]

,t[maxn]

;int cnt,cnt2;

bool vis[maxn]

[maxn]

;bool

cansee

(face &a,point &b)

intmain()

for(

int j=

0;j)for

(int k=

0,x,y;k<

3;k++)if

(vis[x=f[j]

.v[k]

][y=f[j]

.v[(k+1)

%3]]

&&!vis[y]

[x])

t[cnt2++]=

face

(x,y,i)

;for

(int j=

0;j) f[j]

= t[j]

; cnt=cnt2 , cnt2 =0;

}double ans =0;

for(

int i=

0;i) ans +

= f[i]

.area()

;printf

("%.6lf"

,ans)

;}

BZOJ1209 最佳包裹 (三維凸包 增量法)

求三維凸包的表面積。n 100 n le100 n 100 暴力往當前的凸包裡加點。o n 2 o n 2 o n2 題解詳見大佬部落格 擾動函式sha keshake shak e是為了避免四點共面。實測e ps epsep s開到1e 101e 10 1e 10才過 include using ...

BZOJ1209 最佳包裹 (三維凸包 增量法)

求三維凸包的表面積。n 100n 1 00暴力往當前的凸包裡加點。o n 2 o n2 題解詳見大佬部落格 擾動函式sha kesh ake是為了避免四點共面。實測epse ps開到1e 10 1e 1 0才過 include using namespace std define il inline...

bzoj1964 hull 三維凸包

傳送門 二維平面四個點求凸包面積 任選三個點面積之和 2 三維平面五個點求凸包體積 任選四個點體積之和 2 二維平面三個點面積 二個二維向量行列式值的絕對值 2 三維平面四個點體積 三個三維向量行列式值的絕對值 6 1 achen 2 include3 include4 include5 inclu...