部落 解題報告

2021-09-13 17:34:44 字數 1185 閱讀 7225

在乙個社群裡,每個人都有自己的小圈子,還可能同時屬於很多不同的朋友圈。我們認為朋友的朋友都算在乙個部落裡,於是要請你統計一下,在乙個給定社群中,到底有多少個互不相交的部落?並且檢查任意兩個人是否屬於同乙個部落。

輸入在第一行給出乙個正整數n(≤10​4​​),是已知小圈子的個數。隨後n行,每行按下列格式給出乙個小圈子裡的人:

k p[1] p[2] ⋯ p[k]

其中k是小圈子裡的人數,p[i](i=1,⋯,k)是小圈子裡每個人的編號。這裡所有人的編號從1開始連續編號,最大編號不會超過10​4​​。

之後一行給出乙個非負整數q(≤10​4​​),是查詢次數。隨後q行,每行給出一對被查詢的人的編號。

首先在一行中輸出這個社群的總人數、以及互不相交的部落的個數。隨後對每一次查詢,如果他們屬於同乙個部落,則在一行中輸出y,否則輸出n

4

3 10 1 2

2 3 4

4 1 5 7 8

3 9 6 4

210 5

3 7

10 2

yn

題目大意上面說的很清楚,這裡就多說了。

思路:首先我們還是要注意審題!!!,這道題為啥一開始沒想到是並查集呢?因為我沒看見朋友的朋友還是朋友,當時看榜出的那堆人,心裡現在還是涼涼的,所以這是一道簡單的並查集的題目,不過需要用兩個set集合來統計總人數,祖先數。

但是這道題我們用並查集模板上交,會發現其中乙個樣例是卡不過去,顯示執行超時,這是因為普通的並查集模板find函式並不是最優化的狀態,下面的ac**中會給出解釋。

下面給出ac**:

#include #include #include #include using namespace std;

typedef long long ll;

const int inf=0x3f3f3f3f;

const int maxn=1e6+10;

int father[maxn];

setpeo;

setnum;

int find(int x)

void unite(int x,int y)

int main()

return 0;

}

SDOI2010 地精部落解題報告

這道題是我看了題解以後才做出來的,真是一道神題,但是寫題解的大神都不願解釋得太詳細,所以我想了很久才想明白。看了題解以後真的覺得很像數的劃分 約瑟夫問題還有國王遊戲,出奇地簡潔,但是思維量相當地高。主要思路 離散。三個引理 在n n 1的轉化過程中,我們刪除了乙個點後,我們可以將n 1個點視為仍是1...

部落衛隊pascal解題程式

type jh set of 0.100 集合 varn,m,i,u,v,tj longint w jh a,f array 0.100 of boolean s array 1.100 of jh procedure search dep longint w jh t longint dep是第幾...

Block Voting 解題報告

這道題做的有點狼狽,效率不高,差一點就tle的ac了。看status裡的,ac的時間大多數都是0ms的。肯定有乙個更有效率的演算法的。下面說下我的狼狽演算法。出處 http acm.jlu.edu.cn joj showproblem.php?pid 1223 問題描述 求每個party的權值。第i...