ssl1222 矩形 並查集 數學

2021-10-08 08:33:32 字數 1298 閱讀 1426

在乙個平面上有n個矩形。每個矩形的邊都平行於座標軸並且都具有值為整數的頂點。我們用如下的方式來定義塊。

 每乙個矩形都是乙個塊。

 如果兩個不同的矩形有公共線段,那麼它們就組成了乙個新的塊來覆蓋它們原來的兩個塊。

例子:在圖1中的矩形組成了兩個不同的塊。

寫乙個程式:

 找出這些矩形形成的不同的塊的個數。

在輸入檔案pro.in的第一行又乙個整數n,1 <= n <=7000,表示矩形的個數。接下來的n行描述矩形的頂點,每個矩形用四個數來描述:左下頂點座標(x,y)與右上頂點座標(x,y)。每個矩形的座標都是不超過10000的非負整數。

在檔案pro.out的第一行應當僅有乙個整數—表示由給定矩形組成的不同的塊的個數。

903

2645

5742

6420

3253

6432

5314

4700

1400

41

2
這題就是列舉每乙個方塊,如果有重疊的部分就合併(hb函式),最後只需要看看哪個方塊的最終爸爸就是本身,累加出來就是總共的塊的個數。

#include

#include

#include

#include

using

namespace std;

int n,fa[

10001

],ans;

struct node

a[10001];

boolpd(

int x,

int y)

if(a[x]

.x1<=a[y]

.x2&&a[y]

.x1<=a[x]

.x2&&a[x]

.y1<=a[y]

.y2&&a[y]

.y1<=a[x]

.y2)

return

false

;//完全不重疊

}int

father

(int x)

voidhb(

int x,

int y)

intmain()

}}for(

int i=

1;i<=n;i++

) cout<

return0;

}

並查集資料結構的幾種實現

第一種實現 每乙個節點都只是指向根節點 find是 常數時間複雜度的,union是 線性時間複雜度的。class quickfind count n boolean connected int p int q int find int p void union int p int q for int...

皮皮 ssl2542 並查集

皮皮通過一次聚會認識了n個妹子。經過仔細的研究皮皮發現了乙個有趣的現象 那就是有m對妹子是互相認識的。然而如果兩個妹子直接或間接地認識 a認識b,b認識c,則a認識c 那麼皮皮就只能在這兩個妹子裡面選乙個來泡。然而空空空空的皮皮想要泡到盡量多的妹子,於是皮皮就開始採取了一系列的行動 每次讓兩個妹子絕...

並查集 家族 (ssl 1896)

合併一些集合,然後判斷某兩個點是否在同乙個集合內 若某個家族人員過於龐大,要判斷兩個是否是親戚,確實還很不容易,現在給出某個親戚關係圖,求任意給出的兩個人是否具有親戚關係。規定 x和y是親戚,y和z是親戚,那麼x和z也是親戚。如果x,y是親戚,那麼x的親戚都是y的親戚,y的親戚也都是x的親戚。第一行...