考慮用射線(乙個點和乙個向量)表示它左側的半平面
那麼我們可以先按與x軸正半軸夾角(可用atan2(y,x)實現)排序,然後再用雙端佇列維護當前在交中的射線即可
之所以要用雙端佇列,是因為新插入乙個半平面時隊首和隊尾都有可能被彈出,而且要注意的是,要先彈隊尾再彈隊首
在最後,還要再用隊首的彈一些隊尾的
luogu4196 凸多邊形
1 #include2#define pa pair3
#define clr(a,x) memset(a,x,sizeof(a))
4#define mp make_pair
5#define fi first
6#define se second
7using
namespace
std;
8 typedef long
long
ll;9 typedef unsigned long
long
ull;
10 typedef unsigned int
ui;11 typedef long
double
ld;12
const
int maxl=2333,maxn=12,maxm=55;13
const ld eps=1e-9;14
15 inline char
gc()
20inline ll rd()
23while(c>='
0'&&c<='
9') x=(x<<1)+(x<<3)+c-'
0',c=gc();
24return neg?(~x+1
):x;25}
2627
struct
node
30}p[maxn][maxm],it[maxl];
31struct
line
34}l[maxl];
35int
n,m[maxn],cnt;
36int
hd,tl,q[maxl];
3738 inline ld operator ^(const node a,const node b)
39 inline node operator +(const node a,const node b)
40 inline node operator -(const node a,const node b)
41 inline node operator *(const node a,const ld b)
42 inline ld myabs(const ld x)
43 inline node inter(const line a,const
line b)
47 inline bool onright(const line a,const node b)
48 inline ld slope(line a)
4950 inline bool
cmp(line a,line b)
5455
inline ld solve()
65while(hd1]]))) tl--;
66//
while(hd67
//for(int i=hd;i<=tl;i++) printf("~%lf %lf %lf %lf\n",l[q[i]].x.x,l[q[i]].x.y,l[q[i]].y.x,l[q[i]].y.y);
68if(hd+2>tl) return0;
69 ld re=0
;70 q[tl+1]=q[hd];int n=0;71
for(int i=hd;i<=tl;i++) it[++n]=inter(l[q[i]],l[q[i+1
]]);
72for(int i=2;i1])^(it[i+1]-it[1
]));
73return re/2;74
}7576int
main()86}
87 printf("
%.3lf\n
",solve());
88return0;
89 }
半平面交模板
妹的,一直沒有想清楚無解的情況到底是如何判斷的。偷來乙個模板。半平面交的結果 1.凸多邊形 後面會講解到 2.無界,因為有可能若干半平面沒有形成封閉3.直線,線段,點,空 屬於特殊情況吧 演算法 1 根據上圖可以知道,運用給出的多邊形每相鄰兩點形成一條直線來切割原有多邊形,如果多邊形上的點i在有向直...
模板 半平面交
逆時針給出n個凸多邊形的頂點座標,求它們交的面積。例如n 2時,兩個凸多邊形如下圖 則相交部分的面積為5.233。第一行有乙個整數n,表示凸多邊形的個數,以下依次描述各個多邊形。第i個多邊形的第一行包含乙個整數mi,表示多邊形的邊數,以下mi行每行兩個整數,逆時針給出各個頂點的座標。輸出檔案僅包含乙...
半平面交總結and模板
這兩天刷了poj上幾道半平面交,對半平面交有了初步的體會,感覺半平面交還是個挺有用的知識點。半平面交主要是看的zzy的國家隊 他提出的是一種o n log n 的排序增量法。poj 3335 rotating scoreboard 題目大意 world finals 要開始了,比賽場地是乙個多邊形。...