bzoj 2618 半平面交模板 學習筆記

2022-08-19 14:27:09 字數 1936 閱讀 5158

給你n個凸多邊形,求多邊形的交的面積

題意\(=\)給你一堆邊,讓你求半平面交的面積

半平面交模板

1.定義半平面為向量的左側

2.將所有向量的起點放到乙個中心,以中心參照進行逆時針極角排序

但是直接按叉積排序會轉圈圈

於是我們從\(x\)軸負半軸開始逆時針旋轉,將座標軸分為上下兩部(\(x\)軸屬於下部)

當兩個向量終點的\(y\)都在x軸上時,按x從小到大排

當兩個向量終點同在上部/同在下部時,按叉積排(平行按左右排)

當一上一下時,下部的排前

注意:快排時像我這樣貪方便,在cmp裡swap一下想都不想的人也是很罕見的

3.考慮下面這樣一幅圖

黑色為原半平面交的邊界,藍色為新加入的向量

不難發現當之前交點在藍色右邊時,向量1要被刪掉

這樣的話,每次新加入向量,就會刪掉在向量右邊的交點(線上的也要刪)

最後會在所有交點的右邊,畫幅圖出來發現這和凸包是非常像的

然後考慮下面的一幅圖

發現我們維護的凸包首尾都是要刪除的

所以我們要寫乙個雙端佇列

4.考慮平行的兩個向量,一定是保留最左的乙個

5.考慮下面這幅圖

圖上的邊搞完之後都還是在雙端佇列裡的

但是:最後帶紅色標記的那一條邊是無效的,為什麼呢?

因為凸包首尾是連起來的!

所以最後還要模擬插入隊頭,把隊尾中多餘的半平面去掉

6.如果題目沒***半平面封閉,就加上乙個超大的四邊形限制

uoj的一篇部落格寫的很棒,證明也很棒,還提到了一種先求上凸殼,再求下凸殼,再把兩邊多出來的部分刪掉的方法   搓這

#include #include #include #include #include #include using namespace std;

typedef double db;

const int m=507;

inline int rd()

int n,m,tt;

struct pt

}p[m],a[m];

pt operator +(pt x,pt y)

pt operator -(pt x,pt y)

pt operator *(pt x,db d)

pt operator /(pt x,db d)

db slop(pt x)

db dot(pt x,pt y)

db det(pt x,pt y)

db len(pt x)

db dis(pt x,pt y)

db area(pt x,pt y,pt z)

struct line

}l[m],s[m];

pt inter(line x,line y)

bool parallel(line x,line y)

bool lineleft(line x,line y)

bool ptright(pt x,line y)///<=

bool cmp(line x,line y)

l[++m]=line(p[n],p[st]-p[n]);

}hpi();

return 0;

}

BZOJ2618 半平面交)

逆時針給出n個凸多邊形的頂點座標,求它們交的面積。給你n個凸多邊形,求多邊形的交的面積 給你一堆邊,讓你求半平面交的面積 半平面交模板 定義點 struct tpoint 定義線 一點 一方向 struct tline 1.定義半平面為向量的左側 逆時針給出,只需要後乙個減前乙個是方向 2.將所有向...

bzoj2618 凸多邊形 半平面交

bzoj上300題辣!啦啦啦上圖紀念!本來bzoj2618打算第299個做的,然後日常翻題解的時候發現popoqqq居然是第300題做的bzoj2618!為了和大爺同步我就先水另外一題,然後也在第300題a可bzoj2618!和大爺的300題一樣是不是有什麼含義 難道是乙個flag?多個凸多邊形求交...

演算法複習 半平面交(bzoj2618凸多邊形)

這裡套用wuvin 逆時針給出n個凸多邊形的頂點座標,求它們交的面積。例如n 2時,兩個凸多邊形如下圖 則相交部分的面積為5.233。第一行有乙個整數n,表示凸多邊形的個數,以下依次描述各個多邊形。第i個多邊形的第一行包含乙個整數mi 表示多邊形的邊數,以下mi 行每行兩個整數,逆時針給出各個頂點的...