HAOI2007 覆蓋問題

2022-05-08 01:33:06 字數 1126 閱讀 7650

最小化\(l\),使\(3\)個\(l×l\)的正方形能覆蓋圖上\(n\)個點。

首先肯定要二分答案,\(l\)是算不出來的。

然後構建乙個覆蓋所有點的最小矩形。

注意到每條邊至少要乙個正方形靠著。

但現在只有\(3\)個正方形,意味著至少有乙個正方形靠著兩條邊。

靠著相對的兩條邊?那說明這個圖被這\(3\)個正方形併排著覆蓋。

即一定存在靠著相鄰兩條邊(在四角)的正方形。

可以把四種情況都試一遍。

用\(1\)個覆蓋之後又可以重複上面的步驟,以此類推。

然而我因為各種愚蠢錯誤\(wa\)了一版,如開全域性變數(開區域性才能保證互不影響)、打錯條件與數字。。。

複雜度上限\(o(4^3nlogn)\)

#include#include#include#include#include#include#define re register

#define il inline

#define ll long long

#define max(a,b) ((a)>(b)?(a):(b))

#define min(a,b) ((a)<(b)?(a):(b))

#define fp(i,a,b) for(re int i=a;i<=b;i++)

#define fq(i,a,b) for(re int i=a;i>=b;i--)

using namespace std;

const int n=2e4+100;

int n,x[n],y[n];

bool vis[n];

il ll gi()

il int solve(re ll l,re ll r,re ll u,re ll d,re int t,re ll l)

;fp(i,1,n) viss[i]=vis[i];

re int flag=1;

fp(i,1,n) if(!vis[i]) flag=0;

if(flag) return 1;

else if(t>3) return 0;

}int main()

printf("%lld\n",ans);

return 0;

}

HAOI2007 上公升序列

最長上公升子串行有兩種遞推方式。1 f i 表示以第 i 個數結尾的最長上公升子串行長度。2 f i 表示以第 i 個數開始的最長上公升子串行長度。對於本題,要特別注意對字典序最小的規定。我一開始以為是得到的數字序列的字典序最小,還記錄了前驅和一大堆東西,然而全wa了。後來才發現字典序最小是對應的下...

HAOI2007 修築綠化帶

haoi2007 修築綠化帶 時間限制 1 s 記憶體限制 128 mb 問題描述 為了增添公園的景致,現在需要在公園中修築乙個花壇,同時在畫壇四周修建一片綠化帶,讓花壇被綠化帶圍起來。如果把公園看成乙個m n的矩形,那麼花壇可以看成乙個c d的矩形,綠化帶和花壇一起可以看成乙個a b的矩形。如果將...

HAOI2007 修築綠化帶

問題描述 為了增添公園的景致,現在需要在公園中修築乙個花壇,同時在畫壇四周修建一片綠化帶,讓花壇被綠化帶圍起來。如果把公園看成乙個m n的矩形,那麼花壇可以看成乙個c d的矩形,綠化帶和花壇一起可以看成乙個a b的矩形。如果將花園中的每一塊土地的 肥沃度 定義為該塊土地上每乙個小塊肥沃度之和,那麼,...