這兩天刷了poj上幾道半平面交,對半平面交有了初步的體會,感覺半平面交還是個挺有用的知識點。
半平面交主要是看的zzy的國家隊**,他提出的是一種o(n×log(n))的排序增量法。
poj 3335 rotating scoreboard
題目大意:
world finals 要開始了,比賽場地是乙個多邊形。裁判跟教練坐在多邊形的邊上,問場地裡是不是存在乙個區域使得這個區域內的每乙個點都能看到多邊形邊上的計分板。
解題思路:
非常單純的推斷多邊形的核是不是存在。
poj 1474 video surveillance
題目大意:
乙個360度攝像頭。給你乙個多邊形。問多邊形中是否存在乙個區域。將攝像頭放進去能夠監控整個多邊形區域。
解題思路:
相同的半平面交推斷多邊形是否存在核。
poj 3130 how i mathematician wonder what you are!
題目大意:
給出星型的定義:乙個
多邊形f
是星形的條件是有一
點c∈f,
隨意點p∈f
。線段cp都在多邊形f內。
給出乙個多邊形。推斷他是不是乙個星型。
解題思路:
一樣的求多邊形的核是否存在。
poj 1279 art gallery
題目大意:
給出乙個畫廊(不一定是凸多邊形),找到一塊區域。使得這塊區域內的每乙個點都能看到整個畫廊。求出這塊區域的面積。
解題思路:
半平面交求多邊形的核,須要求核的面積。
poj 2451 uyuw's concert
題目大意:
在乙個10000*10000的正方形內舉辦演唱會,中間會有一些警戒線,舞台僅僅能布置在全部警戒線的左側,給定一些線段,問最後舞台的面積是多少。
解題思路:
這是zzy當初為他半平面交排序增量法而出的乙個題。可是後來poj改過資料,所以o(n*n)的演算法也是能夠過去的。
事實上還是乙個半平面交,求交出來的面積的問題。
半平面交的題就做了差點兒相同這些,主要還是看出來題目型別是求半平面交就能夠了,剩下的就好說了。
因為題目都差點兒相同,**沒有太大的變化,所以就僅僅貼乙個**了。
poj 2451 的ac**,能夠當做模板來用了,當時還由於陣列開小了而wa了10多遍。。。。。。為什麼不給我返回個re。。!
#include #include #include using namespace std;
const double eps = 1e-8;
const int maxn = 20010;
int tail, head, it;
struct point p[maxn];
struct line
} l[maxn], deq[maxn];
int dcmp(double x)
double xmult(point a, point b, point c)
bool cmp(line u, line v)
point intersection(line u, line v)
bool judge(line l1, line l2, line l3)
void hpi(line l, int n)
}n = tmp;
deq[0] = l[0], deq[1] = l[1];
head = 0, tail = 1;
for(int i = 2; i < n; ++i)
while(head < tail && judge(deq[head], deq[tail-1], deq[tail]))
tail--;
while(head < tail && judge(deq[tail], deq[head+1], deq[head]))
head++;
if(head == tail) return ;
it = 0;
for(int i = head; i < tail; ++i)
if(tail > head+1)
}double getarea(point p, int n)
return fabs(area)/2.0;
}int main()
, (point)};
l[1] = (line), (point)};
l[2] = (line), (point)};
l[3] = (line), (point)};
l[0].getangle(), l[1].getangle(), l[2].getangle(), l[3].getangle();
for(int i = 4; i < n; ++i)
hpi(l, n);
printf("%.1f\n", getarea(p, it));
}return 0;
}
半平面交模板
妹的,一直沒有想清楚無解的情況到底是如何判斷的。偷來乙個模板。半平面交的結果 1.凸多邊形 後面會講解到 2.無界,因為有可能若干半平面沒有形成封閉3.直線,線段,點,空 屬於特殊情況吧 演算法 1 根據上圖可以知道,運用給出的多邊形每相鄰兩點形成一條直線來切割原有多邊形,如果多邊形上的點i在有向直...
模板 半平面交
考慮用射線 乙個點和乙個向量 表示它左側的半平面 那麼我們可以先按與x軸正半軸夾角 可用atan2 y,x 實現 排序,然後再用雙端佇列維護當前在交中的射線即可 之所以要用雙端佇列,是因為新插入乙個半平面時隊首和隊尾都有可能被彈出,而且要注意的是,要先彈隊尾再彈隊首 在最後,還要再用隊首的彈一些隊尾...
模板 半平面交
逆時針給出n個凸多邊形的頂點座標,求它們交的面積。例如n 2時,兩個凸多邊形如下圖 則相交部分的面積為5.233。第一行有乙個整數n,表示凸多邊形的個數,以下依次描述各個多邊形。第i個多邊形的第一行包含乙個整數mi,表示多邊形的邊數,以下mi行每行兩個整數,逆時針給出各個頂點的座標。輸出檔案僅包含乙...