SDNU 1016 矩形合併 並查集

2021-07-23 22:27:53 字數 1506 閱讀 6524

1016.矩形合併

time limit: 1000 ms    memory limit: 32768 kb

total submission(s): 242    accepted submission(s): 49

description

平面上有n個矩形,給定每個矩形的左下角座標和右上角座標。如果把重合的矩形合併成乙個圖形,則經過合併之後,還剩多少個圖形?

input

第1行:乙個整數n(1 <= n <= 100),表示矩形的數量。

第2至第n+1行:每行有4個整數,第i 行中的4個數字分別表示編號為i-1的矩形的左下角x、y座標與右上角x、y座標。

output

合併後剩餘的圖形數。

sample input

30 0 2 2

1 1 4 4

4 4 5 5

sample output

2hint

相鄰不重合的圖形不合併

首先考慮一下這個矩形什麼情況下合併,因為相鄰不重合的圖形不合併,所以我直接判斷是否不重合,如果不重合的話就一定是重合的。判斷的方式就是,已知乙個矩形a的左下角和右上角,然後用矩形b的左下角和矩形a的右上角進行比較,如果b的左下角在a右上角的上面或右邊的話,一定不重合。以同樣的方法再處理b的右下角,這樣就能判斷出來是否重合了。

畫個圖來表示的話:

如果下乙個圖形的左下角在紅色區域就一定不重合,如果下乙個圖形的右下角再黑色區域就一定不重合,其餘的全部判斷為重合。

然後是進行記錄,輸出重合後會剩餘幾個圖形,表示一開始我是用乙個陣列來儲存的,一開始全初始化為1,然後如果重合後面圖形變為0,最後數有多少個1即可。不過這樣的話 3

0 0 2 2

2 2 4 4

0 0 4 4

這一組資料過不了,然後旁邊隊友說用並查集來做。好吧,其實之前一直覺得並查集沒必要記,之前幾道並查集的題我都直接用自己思路做出來了......所以一直把他忽略掉了,結果這次= =改了並查集之後過了,好吧,原諒我之前把你無視掉了_(:зゝ∠)_

下面ac**:

#include#include#include#includeusing namespace std;

bool vis[105];

int pre[1005];

struct mar

;mar m[105];

int goal(mar a,mar b)

int find(int x)

return r;

}int mix(int x,int y)

return 0;

}int main()

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

}for(i=1;i<=n;i++)

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

cout<

SDNU1016矩形合併 並查集

幾點教訓 1 將資料輸入完成後再進行合併 2 兩個矩形有交點的函式如果用必然有乙個點的座標在另乙個矩形內這個原理來寫,一共有8種情況,不能遺漏,下面是ac include include includeusing namespace std const int maxn 105 struct nod...

按秩合併並查集

1.通過比較並查集的大小來連邊,將小的 u 向大的 v 連邊,這樣對於大的並查集,查詢代價不變,而小的並查集查詢代價每個點增加了1,相當於增加了siz u 反過來則變成了siz v siz u logn 因為每上一層大小減半 2.相較於路徑壓縮的並查集,他可以保留原始的資訊 例題 bzoj4668 ...

leetcode 721 賬戶合併 並查集

查詢並返回所在集合的根節點 find 注意 根節點特性是 father i i 每次查詢時進行路徑壓縮,保證集合樹的高度不大於2 int find int i return f 根節點 合併兩個元素所在集合 combine void combine int i,int j 本題的重點是抽象 對映 確...