題目描述
有n個島嶼和m座橋梁,第i座橋梁雙向連線編號為ai和bi的兩座島嶼。
最初,我們可以使用這些橋梁在任何兩個島嶼之間旅行。
然而,調查結果顯示,從第1座到第m座橋梁都會因老化而依次倒塌。每倒塌一座橋梁,就會存在多對島嶼(a,b)(其中a假設倒塌順序是:從第1座到第m座橋梁依次倒塌,那麼請你分別計算在橋梁i(1≤i≤m)倒塌後有多少對島嶼(a,b)之間不能再進行通行了。
請注意,答案可能超過32位整數型別。
輸入輸出格式
輸入格式:
第一行是兩個整數n和m,分別是島嶼的數量和橋梁的數量。
接下來有m行,每行兩個整數ai和bi ,表示連線島嶼ai和bi的一座橋梁。
輸出格式:
輸出m行,每行乙個整數,依次表示當第i座橋倒塌後不能再進行通行的島嶼對數。
輸入輸出樣例
輸入樣例#1:
4 51 2
3 41 3
2 31 4
輸出樣例#1:00
456輸入樣例#2:
6 52 3
1 25 6
3 44 5
輸出樣例#2:89
1214
15輸入樣例#3:
2 11 2
輸出樣例#3:1說明
【樣例1說明】
例如,當第1到第3座橋梁倒塌時,答案為4,因為我們不能再在橋梁對(1,2)、(1,3)、(2,4)和(3,4)之間通行。
【資料範圍】
對於100%的資料:2≤n≤105;1≤m≤105;1≤ai<bi≤n
所有的(ai,bi)都是不同的。
#include
using
namespace std;
long
long n,m,cnt;
const
int max=
2000010
;long
long fa[max]
;long
long first[max]
,next[max]
,from[max]
,to[max]
,tot[max]
,ans[max]
;//tot為以i為fa的聯通塊中點個數
long
long broke[max]
;void
init()
}int
findfa
(long
long x)
void
mergefa
(long
long a,
long
long b)
void
build
(long
long u,
long
long v)
intmain()
ans[m+1]
=n*(n-1)
/2;for
(int i=m;i>=
1;i--
)else
ans[i]
=ans[i+1]
;}for(
int i=
2;i<=m+
1;i++
) cout<
}
橋梁模式 Bridge Pattern
橋接模式,將實現類和介面類拆分開來,不使用繼承,介面類 抽象類 持有乙個橋接類的引用,根據傳入的橋接實現類引用。這樣在改變橋接類的情況下就可以改變抽象類的執行結果。名詞類 抽象部分 public abstract class circle protected abstract void drawci...
橋梁模式 bridge
橋梁模式的用意是將問題的抽象和實現分離開來實現,通過用聚合代替繼承來解決子類 性增長的問題。比如我們有乙個畫圖程式 有2個圖形 circle rectangle 和2種畫圖方法 drawing1 drawing2 圖形可能會使用drawing1來畫圖 也可能使用drawing2來畫圖 在這個畫圖程式...
橋梁 Bridge 模式
9 橋梁 bridge 模式 橋梁模式的結構圖 這個系統含有兩個等級結構 facade模式的角色 例項 抽象化角色 public abstract class abstaction 修正抽象化角色 public class refinedabstraction extends abstaction ...