CQOI2006 凸多邊形 暴力半平面交

2022-09-10 00:12:33 字數 1462 閱讀 9617

半平面交總覺得和線性規劃莫名的像?

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

則相交部分的面積為5.233。輸入格式:第一行有乙個整數n,表示凸多邊形的個數,以下依次描述各個多邊形。第i個多邊形的第一行包含乙個整數mi,表示多邊形的邊數,以下mi行每行兩個整數,逆時針給出各個頂點的座標。輸出格式:輸出檔案僅包含乙個實數,表示相交部分的面積,保留三位小數。輸入樣例#1:複製

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]內的整數

直接暴力求半平面交o(n^2)裸題。之後再考慮寫o(n)半平面交吧。

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

typedef double db;

const int maxn = 505;

const db eps = 1e-8;

struct pts[maxn],r[maxn],t[maxn]; int tot;

pt operator+(pt a,pt b) ; }

pt operator-(pt a,pt b) ; }

pt operator*(db k,pt a) ; }

db operator*(pt a,pt b)

db operator^(pt a,pt b)

struct line;

pt getcut(line a,line b) ,a);

}if( ((a.v)^(s[i+1]-a.p)) > eps) ,a);

}} else t[++o] = s[i];

} for(int i=1;i<=o;i++) s[i] = t[i];

tot = o;

}int n;

int main() ;

s[2] = (pt);

s[3] = (pt);

s[4] = (pt);

tot = 4;

for(int tim = 1;tim <= n; tim++)

r[k+1] = r[1];

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

} }db ans = 0;

s[tot+1] = s[1];

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

printf("%.3lf\n",ans/2);

}

2618 Cqoi2006 凸多邊形

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

BZOJ 2618 Cqoi2006 凸多邊形

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

P4196 CQOI2006 凸多邊形

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