對於乙個平面上點的集合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 #include6using
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,...