2618 Cqoi2006 凸多邊形

2021-08-05 21:04:25 字數 1404 閱讀 5456

逆時針給出

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

則相交部分的面積為5.233。

第一行有乙個整數n,表示凸多邊形的個數,以下依次描述各個多邊形。第i個多邊形的第一行包含乙個整數mi

,表示多邊形的邊數,以下mi

行每行兩個整數,逆時針給出各個頂點的座標。

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

-2 0

-1 -2

1 -2

2 01 2

-1 2

40 -3

1 -1

2 2-1 0

5.233

題解:一看就發現是半平面交裸題吧。

反正蒟蒻只想到拆成每條線段求他們的半平面交。

邊界打錯真是日了

#include#include#include#include#include#includeusing namespace std;

#define eps 1e-13

double maxx=1001.0;

double minn=-1001.0;

const int n=5100;

struct nodesb[n],ss[n];int pl,cnt=0;

struct node2

node2(double x1,double y1,double x2,double y2)

void get_angle()

}seg[n],sa[n];int st,ed;

double mulit(node p1,node p2,node p0)

bool satify(node x,node2 y)

bool cmp(node2 x,node2 y)

while(st

while(st

if(ed-st+1<=2)

pl=0;

for(int i=st;i

sb[++pl]=jd(sa[ed],sa[st]);

double ans=0.000;

for(int i=3;i<=pl;i++) ans+=mulit(sb[i-1],sb[i],sb[1]);

printf("%0.3lf",fabs(ans)/2.000);

}int n,m;

int main()

for(int j=1;j

seg[++cnt]=node2(ss[j].x,ss[j].y,ss[j+1].x,ss[j+1].y),seg[cnt].get_angle();

seg[++cnt]=node2(ss[m].x,ss[m].y,ss[1].x,ss[1].y),seg[cnt].get_angle();

} work();

}

BZOJ 2618 Cqoi2006 凸多邊形

真 半平面交,半平面交模板題,按照題目描述將每個多邊形拆分成n個向量,我們規定向量的左側為其指定的區域,參照了po姐的寫法,因為雙端佇列實在是不好搞,我們先在乙個方向加線,然後再在最後刪隊首隊尾,值得注意的是用向量求交點和用向量判斷乙個點是否在這條向量的左面。include include incl...

CQOI2006 NKOJ2004 移動棋子

cqoi2006 移動棋子 time limit 50000ms memory limit 65536k case time limit 5000ms description 在乙個n n的棋盤上有n枚棋子。每次可以把一枚棋子往上 下 左 右方向之一移動一格,最後排成一行 一列或者主 副對角線上 因...

CQOI2006 簡單題 線段樹

水。區間修改,單點查詢。用線段樹維護區間 l,r 內的所有 1 的個數,懶標記表示為當前區間是否需要反轉 相對於區間當前狀態 下方標記時懶標記取反即可。include include define sl x 1 define sr x 1 1 define maxn 100010 using nam...