洛谷P1034矩形覆蓋

2021-08-21 00:23:26 字數 1211 閱讀 9988

據說是dp,所以我用dfs,居然a了,資料真水

說說思路,我們要求覆蓋所有點且不能重疊,顯然我們要從點入手,我們可以列舉每個點被哪個矩形重疊,因為如果列舉矩形覆蓋點的話,貌似不可做,具體怎麼實現呢?最好小夥伴們手動畫個圖,一下就明白了,列舉每個點被哪個矩形覆蓋,那麼必然是要根據點的座標來調整矩形的位置,所以我們需要判斷當前列舉的點的座標與當前矩形的關係,顯然有兩種關係,在矩形內部,在矩形外部,在內部顯然矩形不需要變化,在矩形外部呢?我們需要分類討論

1.在矩形兩側,高度範圍在矩形的高度範圍內,那麼調整矩形橫座標

2.在矩形上下,橫座標在矩形的橫座標範圍內,那麼調整矩形縱座標

3.完全脫離矩形範圍,這時就要根據點的座標進行大調整

然後是如何判斷重合,自己將兩個矩形重疊時的樣子畫出來,標上座標,一共四種情況,直接if判斷就好,資料水 ,不需要剪枝,也是0ms過,233

**

//by acermo
#include#include#include#include#includeusing namespace std;

const int m=1050;

struct emm

poi[m];

struct square

}fg[5];

int vis[m][m];

int n,m,ans=m*m;

int gets(int i)

int add(int po,int sq)//分類討論點和矩形的關係

int s=gets(sq);

if (poi[po].xfg[sq].y2) fg[sq].y2=poi[po].y;

return (gets(sq)-s);

}//點在矩形左側,更改矩形面積 ,返回差值

if (poi[po].x>=fg[sq].x1&&fg[sq].x2>=poi[po].x)

if (poi[po].yfg[sq].y2) fg[sq].y2=poi[po].y;

return (gets(sq)-s);

} return 0;

}bool check()//判斷是否存在違法狀態

void dfs(int used,int sum)

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

return ;

}int main()

搜尋 洛谷P1034 矩形覆蓋

然後就知道這個是noip提高的題目 說好k 4,其實k最大只有3 然後資料沒有對每一種情況近判斷性,所以本來300 的 因為有些用不到可以變成100 我曹 include include include define ll long long using namespace std int x 51...

洛谷 P1034 矩形覆蓋(dfs)

有n個點k個矩陣,k個矩陣包含n個點,求這k個矩陣的最小面積 因為資料範圍很小,所以可以直接暴搜,求每個點可以存在矩陣的位置,利用幾次剪枝 因為資料太水,不剪也行 即可通過 include using namespace std define ll long long const int maxn ...

洛谷 P1034 矩形覆蓋 dfs

可能是資料太水了瞎搞都可以過。判斷兩個平行於座標軸的矩形相交 含頂點與邊相交 的 一併附上。記得這裡的xy和udlr是指數學上的座標軸。includeusing namespace std define ll long long struct point p 51 struct rectangle ...