bzoj1052覆蓋問題 二分 貪心

2022-04-06 01:31:54 字數 1571 閱讀 6260

time limit: 10 sec  memory limit: 162 mb

submit: 2446  solved: 1131

[submit][status][discuss]

某人在山上種了n棵小樹苗。冬天來了,溫度急速下降,小樹苗脆弱得不堪一擊,於是樹主人想用一些塑料薄

膜把這些小樹遮蓋起來,經過一番長久的思考,他決定用3個l*l的正方形塑料薄膜將小樹遮起來。我們不妨將山建

立乙個平面直角座標系,設第i棵小樹的座標為(xi,yi),3個l*l的正方形的邊要求平行與座標軸,乙個點如果在

正方形的邊界上,也算作被覆蓋。當然,我們希望塑料薄膜面積越小越好,即求l最小值。

第一行有乙個正整數n,表示有多少棵樹。接下來有n行,第i+1行有2個整數xi,yi,表示第i棵樹的座標,保證

不會有2個樹的座標相同。

一行,輸出最小的l值。

40 1

0 -1

1 0-1 0

1100%的資料,n<=20000

/*

二分答案後怎麼覆蓋呢

容易想到找最左上角,左下角,右上角,右下角的點搞一搞

就是說先得找個最小矩形把所有點覆蓋起來。

然後怎麼用三個正方形覆蓋所有點呢?

顯然必須滿足覆蓋最外邊的點,因此就是要從大矩形四個角入手。

先找乙個角放上乙個,最優解一定有這個。

然後把它覆蓋的點刪去,就成了乙個子問題。更新大矩形,再放乙個。

判斷最後剩下的點能不能用最後乙個正方形 覆蓋即可。

o(nlogn)

*/#include

#define inf 1000000001

#define ll long long

#define n 20007

using

namespace

std;

intn,ans,mid;

struct

nodea,b;

intread()

while(ch>='

0'&&ch<='9')

return x*f;

}void cut(node &a,int x1,int y1,int x2,int

y2)//刪點

a.rest=tot;

} void solve(node &a,int

opt)//放兩個正方形

if(opt==1) cut(a,x1,y1,x1+mid,y1+mid);

if(opt==2) cut(a,x2-mid,y1,x2,y1+mid);

if(opt==3) cut(a,x1,y2-mid,x1+mid,y2);

if(opt==4) cut(a,x2-mid,y2-mid,x2,y2);

}bool

judge()

if(x2-x1<=mid&&y2-y1<=mid)return

1;//最後乙個可以蓋住

}return0;

}int

main()

printf(

"%d\n

",ans);

return0;

}

bzoj1052 覆蓋問題 二分答案 dfs

題意 找到乙個最小邊長,使得以此為邊長 3 個正方形可以覆蓋平面上給定的一些點。華麗爆零 首先看到最小果斷想二分答案 然後我們證明乙個東西 首先,根據鴿巢原理,3 個正方形覆蓋由所有點構成的最小矩形一定有乙個正方形是壓著至少兩條邊的 然後不外乎兩種情況 1 壓的是對邊,那麼每個都在壓對邊,有乙個正方...

bzoj1052 覆蓋問題

先二分答案,容易發現一定有乙個正方形覆蓋在角上 即有兩條邊在最x的地方 否則4個最x的點一定無法覆蓋,然後暴力確定即可 1 include2 using namespace std 3struct ji8 a 20005 9 int n,vis 20005 10 void bj int lx,int...

BZOJ1052 覆蓋問題(貪心)

bzoj 洛谷這題好神仙啊。很明顯可以看出來要二分乙個邊長。那麼如何ch eck che ck 呢?我們把所有點用乙個最小矩形覆蓋,那麼必定每個邊界上都至少存在乙個點,但是我們有 4 4 個邊界,但是只有 3 role presentation 3 3個矩形,意味著至少有乙個矩形卡住了兩個邊界,那麼...