kuangbin帶你飛 專題五 並查集 題解

2021-09-14 05:03:22 字數 4270 閱讀 2005

專題五 並查集

雞山村發生了一次**。acm (asia cooperated medical 亞洲聯合醫療隊) 已經為聖維爾供電中心的電腦搭建了乙個無線網路,但受到了一次不可預知的餘震攻擊,因此網路中的所有電腦都被破壞了。電腦被逐台修復,網路逐步恢復了工作。由於受到硬體的約束,每台電腦只能與距離它不超過 d 公尺的其它電腦直接通訊。但每台電腦可被看作其它兩台電腦的通訊中轉點,也就是說,如果電腦 a 和電腦 b 可以直接通訊,或存在一台電腦 c 既可與 a 也可與 b 通訊,那麼電腦 a 和電腦 b 之間就能夠通訊。 

在處理網路修復的過程中,工作人員們在任何乙個時刻,可以執行兩種操作:維修一台電腦,或測試兩台電腦是否能夠通訊。請您找出全部的測試操作。 

輸入

第一行包含了兩個整數 n 和 d (1 <= n <= 1001, 0 <= d <= 20000)。此處 n 是電腦的數目,編號從 1 到 n;同時,d 是兩台電腦之間能夠直接通訊的最大距離。接下來的 n 行,每行包含兩個整數 xi, yi (0 <= xi, yi <= 10000),表示 n 臺電腦的座標。從第 (n+1) 行到輸入結束,是逐一執行的操作,每行包含乙個操作,格式是以下兩者之一: 

1. "o p" (1 <= p <= n),表示維護電腦 p 。 

2. "s p q" (1 <= p, q <= n),表示測試電腦 p 和 q 是否能夠通訊。 

輸入不超過 300000 行。 

輸出

對於每個測試操作,如果兩台電腦能夠通訊,則列印 "success";否則,列印 "fail"。

示例輸入

4 1

0 10 2

0 30 4

o 1o 2

o 4s 1 4

o 3s 1 4

示例輸出

fail

success

挺簡單的一道並查集,每一次修復和已修列表中的點繼續一次有條件的合併,查詢更簡單o(1)

#include#include#includeusing namespace std;

int n,d,x,y;

char op;

int f[1005];

int w[1005][2];

vectorv;//鑽入啟用過的點

int find(int x)

void merge(int x,int y)

int main()

while(cin>>op)

void merge(int x,int y)

int main()

void merge(int x,int y)

}int main()

printf("%d\n",ans);

}return 0;

}

問題描述tt和ff是......朋友。呃...非常非常好的朋友-________- b 

ff是乙個壞孩子,他總是求助tt與他一起玩下面的遊戲。這是乙個非常單調乏味的遊戲。首先,tt應該記下一系列整數-_- !!(無聊)。

然後,ff可以從中選擇連續的子串行(例如,從第三個到第五個整數的子串行)。之後,ff將詢問tt他選擇的子串行的總和是什麼。接下來,tt將回答ff的問題。然後,ff可以重做此過程。最後,ff必須計算整個整數序列。

無聊~~無聊~~乙個非常無聊的遊戲!tt根本不想玩ff。為了懲罰ff,她經常故意告訴ff錯誤的答案。

這個壞孩子不是傻子。ff檢測到一些答案不相容。當然,這些矛盾使得計算序列變得困難。

然而,tt是乙個漂亮可愛的女孩。她對ff沒有心。為了節省時間,如果確實沒有邏輯錯誤,她保證答案是正確的。

更重要的是,如果ff找到錯誤的答案,他會在判斷下乙個答案時忽略它。

但是會有這麼多問題,糟糕的ff無法確定當前的答案是對還是錯。所以他決定寫乙個程式來幫助他解決這個問題。該計畫將收到ff的一系列問題以及ff從tt收到的答案。該計畫的目的是找出錯誤的答案數量。只有通過忽略錯誤的答案,ff才能計算整個整數序列。可憐的ff沒有時間做這項工作。現在他正在尋求你的幫助〜(為什麼要為自己麻煩~~壞男孩)

輸入

第1行:兩個整數,n和m(1 <= n <= 200000,1 <= m <= 40000)。意味著tt寫了n個整數,ff問了m個問題。

線2..m + 1:線i + 1包含三個整數:ai,bi和si。手段tt回答ff,從ai到bi的總和是si。保證0

產量

帶整數的單行表示錯誤的答案數。

樣本輸入

10 5

1 10 100

7 10 28

1 3 32

4 6 41

6 6 1

樣本輸出1

hdu3038 how many answers are wrong 擴充套件並查集

#include#includeusing namespace std;

int n,m,ans=0;

int f[200005];

int sum[200005];

int find(int x)

void union(int x,int y,int v)

}else

return;}

int main()

ans=0;

while(m--)

printf("%d\n",ans);

}return 0;

}

description動物王國中有三類動物a,b,c,這三類動物的食物鏈構成了有趣的環形。a**, b吃c,c吃a。 

現有n個動物,以1-n編號。每個動物都是a,b,c中的一種,但是我們並不知道它到底是哪一種。 

有人用兩種說法對這n個動物所構成的食物鏈關係進行描述: 

第一種說法是"1 x y",表示x和y是同類。 

第二種說法是"2 x y",表示x吃y。 

此人對n個動物,用上述兩種說法,一句接一句地說出k句話,這k句話有的是真的,有的是假的。當一句話滿足下列三條之一時,這句話就是假話,否則就是真話。 

1) 當前的話與前面的某些真的話衝突,就是假話; 

2) 當前的話中x或y比n大,就是假話; 

3) 當前的話表示x吃x,就是假話。 

你的任務是根據給定的n(1 <= n <= 50,000)和k句話(0 <= k <= 100,000),輸出假話的總數。 

input

第一行是兩個整數n和k,以乙個空格分隔。 

以下k行每行是三個正整數 d,x,y,兩數之間用乙個空格隔開,其中d表示說法的種類。 

若d=1,則表示x和y是同類。 

若d=2,則表示x吃y。

output

只有乙個整數,表示假話的數目。

sample input

100 7

1 101 1

2 1 2

2 2 3

2 3 3

1 1 3

2 3 1

1 5 5

sample output

3
sourcenoi 01

poj 1182 食物鏈 帶權並查集經典模板(noi2001)

#includeconst int maxn = 50000+10;

int p[maxn]; //存父節點

int r[maxn];//存與父節點的關係 0 同一類,1被父節點吃,2吃父節點

void init(int n)}

int find(int x)

void union(int x, int y, int d)

int main()

else

union(x, y, d); //如果開始沒有關係,則建立關係

}printf("%d\n", ans);

return 0;

}

kuangbin帶你飛 專題五 並查集

裸的並查集,每次修好乙個點之後就掃一遍,將它與在它連線範圍內的之前就修好的點進行合併,唯一需要注意的點就是可以用點之間距離的平方來避免精度問題 include include include const int maxn 10000 5 struct point point maxn struct ...

kuangbin帶你飛專題

kuangbin帶你飛 專題一 簡單搜尋 kuangbin帶你飛 專題二 搜尋高階 kuangbin帶你飛 專題三 dancing links kuangbin帶你飛 專題四 最短路練習 kuangbin帶你飛 專題五 並查集 kuangbin帶你飛 專題六 最小生成樹 kuangbin帶你飛 專題...

kuangbin帶你飛 專題十八 字尾陣列

寫了好久才把字尾陣列的專題寫完 字尾陣列就是對字串的所有字尾來搞事,通過對這些字尾排序,來得到這些字尾之前存在的關係。字尾陣列中的sa陣列 排名陣列 和height 相鄰排名lcp 有很多很有用的特性,使得在處理一些字串問題的時候很給力,比較流行的求字尾陣列的演算法有o nlogn 的倍增求法和o ...