模板 半平面交

2022-05-02 06:12:08 字數 1570 閱讀 4888

逆時針給出n個凸多邊形的頂點座標,求它們交的面積。例如n=2時,兩個凸多邊形如下圖:

則相交部分的面積為5.233。

第一行有乙個整數n,表示凸多邊形的個數,以下依次描述各個多邊形。第i個多邊形的第一行包含乙個整數mi,表示多邊形的邊數,以下mi行每行兩個整數,逆時針給出各個頂點的座標。

輸出檔案僅包含乙個實數,表示相交部分的面積,保留三位小數。

2

6-2 0

-1 -2

1 -2

2 01 2

-1 2

40 -3

1 -1

2 2-1 0

輸出 #1

5.233

100%的資料滿足:2<=n<=10,3<=mi<=50,每維座標為[-1000,1000]內的整數

題解都在**裡

#include//

半平面交

#define ll long long

using

namespace

std;

const

int n = 1100

;int

n, cnt, tot;

double

ans;

struct

p p[n], a[n];

struct

l l[n], q[n];

p operator-(p a, p b)

double

operator*(p a, p b)

bool

operator

p inter(l a, l b)

bool check(l a, l b, l t)

void hpi()

cnt =tot;

tot = 0

; q[++r] = l[1];//

單調佇列

q[++r] = l[2

];

for (int i = 3; i <= cnt; i++)

while (l < r && check(q[r - 1], q[r], q[l]))r--;//

最後用隊首的向量排除一下隊尾多餘的向量

while (l < r && check(q[l + 1], q[l], q[r]))l++;//

應該沒必要

q[r + 1] =q[l];

for (int i = l; i <= r; i++)

a[++tot] = inter(q[i], q[i + 1

]);}

void getans()

intmain()

for (int i = 1; i <= cnt; i++)

l[i].val = atan2(l[i].b.y - l[i].a.y, l[i].b.x -l[i].a.x);

hpi();

getans();

cout

<< fixed

<< setprecision(3) << ans <

return0;

}

半平面交模板

妹的,一直沒有想清楚無解的情況到底是如何判斷的。偷來乙個模板。半平面交的結果 1.凸多邊形 後面會講解到 2.無界,因為有可能若干半平面沒有形成封閉3.直線,線段,點,空 屬於特殊情況吧 演算法 1 根據上圖可以知道,運用給出的多邊形每相鄰兩點形成一條直線來切割原有多邊形,如果多邊形上的點i在有向直...

模板 半平面交

考慮用射線 乙個點和乙個向量 表示它左側的半平面 那麼我們可以先按與x軸正半軸夾角 可用atan2 y,x 實現 排序,然後再用雙端佇列維護當前在交中的射線即可 之所以要用雙端佇列,是因為新插入乙個半平面時隊首和隊尾都有可能被彈出,而且要注意的是,要先彈隊尾再彈隊首 在最後,還要再用隊首的彈一些隊尾...

半平面交總結and模板

這兩天刷了poj上幾道半平面交,對半平面交有了初步的體會,感覺半平面交還是個挺有用的知識點。半平面交主要是看的zzy的國家隊 他提出的是一種o n log n 的排序增量法。poj 3335 rotating scoreboard 題目大意 world finals 要開始了,比賽場地是乙個多邊形。...