給你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 行每行兩個整數,逆時針給出各個頂點的...