bzoj 2564 集合的面積

2022-05-10 23:31:16 字數 1646 閱讀 4743

對於乙個平面上點的集合p=,定義集合p的面積f(p)為點集p的凸包的面積。

對於兩個點集a和b,定義集合的和為:

a+b=

現在給定乙個n個點的集合a和乙個m個點的集合b,求2f(a+b)。

第一行包含用空格隔開的兩個整數,分別為n

和m;第二行包含n個不同的數對,表示a集合中的n個點的座標;

第三行包含m個不同的數對,表示b集合中的m個點的座標。

一共輸出一行乙個整數,2f

(a+b)。

4 50 0 2 1 0 1 2 0

0 0 1 0 0 2 1 2 0 1

18資料規模和約定

對於30%的資料滿足n ≤ 200,m ≤ 200;

對於100%的資料滿足n ≤ 10^5,m ≤ 10^5,|xi|, |yi| ≤ 10^8。

分別求出兩個點集的凸包,然後貪心地加點就行。

a和b凸包第乙個點肯定在答案裡

然後貪心,如果a到了i,b到了j

顯然如果a[i+1]+b[j]比a[i]+b[j+1]更凸,也就是在右邊,那麼就i+1,否則j+1

這樣構造出的新凸包即為答案

1 #include2 #include3 #include4 #include5 #include6

using

namespace

std;

7 typedef long

long

lol;

8struct

point

9p[200001],s[3][200001],sta[1000001

];12

intn,m,c,top;

13lol ans;

14lol cross(point a,point b)

1518 point operator -(point a,point b)19;

21}22 point operator +(point a,point b)23;

25}26bool

cmp(point a,point b)

2730

lol dist(point a)

3134

bool

cmp2(point a,point b)

3540

int graham(int n,int

c)41

53return

top;54}

55int

main()

56 62 n=graham(n,1

);63

for (i=1;i<=m;i++)

6467 m=graham(m,2

);68 sta[top=1]=s[1][1]+s[2][1

];69

for (i=1,j=1;i<=n||j<=m;)

7076

for (i=2;i)

77 ans+=cross(sta[i]-sta[1],sta[i+1]-sta[1

]);78 printf("

%lld

",ans);

79 }

題解 bzoj2564 集合的面積

傳送門 題面的定義顯然就是求乙個點集a,b a,ba,b的閔可夫斯基和的凸包的面積的兩倍。那麼這道題就是閔可夫斯基和的模板了。所謂閔可夫斯基和,即給你兩個點集a,b a,ba,b,求乙個點集c c c c cc即點集a,b a,ba,b的閔可夫斯基和。對於求閔可夫斯基和,我的理解是 我們考慮先求a,...

bzoj 2734 集合選數

構造矩陣 1 3 9 27 2 6 18 54 4 12 36 108 每個數是上面的數乘2,左面的數乘3。這樣進行狀壓dp就是相鄰的格仔不能選的方案數。如何判斷乙個二進位制數沒有兩個連續的1?x x 1 0 如果有的數沒有出現過,就以它為左上角元素再構造乙個矩陣。這是怎麼想到的?include i...

BZOJ2734 集合選數

集合論與圖論 這門課程有一道作業題,要求同學們求出的所有滿足以 下條件的子集 若 x 在該子集中,則 2x 和 3x 不能在該子集中。同學們不喜歡這種具有列舉性 質的題目,於是把它變成了以下問題 對於任意乙個正整數 n 100000,如何求出 的滿足上述約束條件的子集的個數 只需輸出對 1,000,...