P4196 CQOI2006 凸多邊形

2022-05-02 06:12:06 字數 1584 閱讀 4567

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

則相交部分的面積為5.233。

第一行有乙個整數n,表示凸多邊形的個數,以下依次描述各個多邊形。第i個多邊形的第一行包含乙個整數mi,表示多邊形的邊數,以下mi行每行兩個整數,逆時針給出各個頂點的座標。

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

輸入 #126

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

#include//

求凸多邊形面積

#define ll long long

using

namespace

std;

const

int n = 1100

;int

n, cnt, tot;

double

ans;

struct

p p[n], a[n];

struct

l l[n], q[n];

p operator-(p a, p b)

double

operator*(p a, p b)

bool

operator

p inter(l a, l b)

bool check(l a, l b, l t)

void hpi()

cnt =tot;

tot = 0

; q[++r] = l[1];//

單調佇列

q[++r] = l[2

];

for (int i = 3; i <= cnt; i++)

while (l < r && check(q[r - 1], q[r], q[l]))r--;//

最後用隊首的向量排除一下隊尾多餘的向量

while (l < r && check(q[l + 1], q[l], q[r]))l++;

q[r + 1] =q[l];

for (int i = l; i <= r; i++)

a[++tot] = inter(q[i], q[i + 1

]);}

void getans()

intmain()

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

l[i].val = atan2(l[i].b.y - l[i].a.y, l[i].b.x -l[i].a.x);

hpi();

getans();

cout

<< fixed

<< setprecision(3) << ans <

return0;

}

P4170 CQOI2007 塗色 題解

同步 原題鏈結 簡要題意 一開始你有乙個長度為 n nn 的無色串,每次可以對乙個區間染上相同的顏色。問最少多少次可以形成目標串。告訴你,這題的藍是假的,太假了,資料也太弱了。完全是個暴力選手亂碾標算用的,其實本題的時間複雜度完全可以做到 o n 3 o n 3 o n3 第一眼看資料範圍還以為是大...

P2261 CQOI2007 餘數求和

數學題,無背景 給出正整數n和k,計算g n,k k mod 1 k mod 2 k mod 3 k mod n的值,其中k mod i表示k除以i的餘數。例如g 10,5 5 mod 1 5 mod 2 5 mod 3 5 mod 4 5 mod 5 5 mod 10 0 1 2 1 0 5 5 ...

P2261 CQOI2007 餘數求和

我是題面 題意還是很清晰,很容易理解 1e9範圍明顯不能暴力,除非你能把常數優化到 frac1 但我實在想象不到用了這麼多取模怎麼把常數優化下去 我們可以把 k i 變成 k k i i 整除 那麼總的和也就從 sum k i 變成了 sum n k k i i 又可以轉化為 nk sum n k ...