這道題目思維量還是挺大的,因為這道題也是維護集合關係,所以我們想到用並查集去維護。
我們應該想到的是,用map對映一下位置,因為原來的資料比較大,不宜維護並查集關係,並且設計兩個原點 0 和n+1,表示ab集合,這招是常見手段,因為這兩個點是特殊的。之前有到異或並查集也是設計乙個另外的原點
又因為x和a-x要是一體的,所以如果x和a-x都存在,那麼我們就把他們合併一下,如果不存在,那麼證明x必須要去b集合,因此我們將它和n+1合併
x和b-x同理。那麼合併完後,如果出現0和n+1的父親節點一樣,說明至少有乙個點兩個集合都要在,所以輸出no
否則,我們列舉看他屬於a還是b集合,這裡就出現了最關鍵的一點,也就是有些點兩個集合都可以在,所以優先考慮b
這是什麼情況呢,比如x1,x2,x3,x4
a-x1=x2
b-x1=x3
a-x4=x3
b-x4=x2
類似這樣的情況。所以這些點既沒有和0點相連,也沒有和n+1相連,所以在判斷的時候,要先判斷a,只有必須在a的才是a,其他都是b
#include#includeview code#include
#include
#include
using
namespace
std;
const
int n=1e5+5
;map
m1;intp[n];
ints[n];
int find(int
x)
return
p[x];
}void add(int a,intb)}
intmain()
for(i=1;i<=n;i++)
for(i=1;i<=n;i++)
int pa=find(0
);
int pb=find(n+1
);
if(pa==pb)
else
}return0;
}
P1621 集合 尤拉篩 並查集
題目鏈結 這個題要求我們在乙個區間 a,b 中找出幾個集合,集合中的數滿足是乙個大於等於p的質因數的個數。看到集合這個定義,我們瞬間會想到用並查集來維護這個集合,那麼對於這個集合,他滿足乙個性質,就是如果我們,起始的時候初始化每乙個數的父親都是自己,那麼每乙個集合中有且只有乙個數的父親 是自己。根據...
合根植物(並查集)
如果我們告訴你哪些小格仔間出現了連根現象,你能說出這個園中一共有多少株合根植物嗎?輸入格式 第一行,兩個整數m,n,用空格分開,表示格仔的行數 列數 1格仔的編號一行一行,從上到下,從左到右編號。比如 5 4 的小格仔,編號 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1...
並查集問題
輸入 第一行 城鎮數目n,道路數目m 接下的每一行表示 某條道路連線的城鎮號 輸出 至少還需要建設的道路數目,才能將所有的城鎮連線起來 例子 輸入 3 31 2 1 22 1 輸出 1解釋 要使城鎮123連通,還需要修建23之間的連通路 即還需要修建一條路 cpp實現問題求解 include usi...