題目大意:給出一個由 n 個點和 m 條邊組成的無向圖,每個點初始時都有顏色 i ,i ∈ [ 0 , n - 1 ] ,接下來有 q 次操作,每次操作會給出一種顏色 x ,分兩種情況討論:
如果顏色為 x 的點不存在,則跳過此次操作
如果顏色為 x 的點存在,則將顏色為 x 的點的相鄰的所有顏色塊,都染成 x 的顏色
問最后每個點的顏色是什么
題目分析:合并問題不難想到并查集,對于每個點的顏色可以用并查集來維護,不過如果暴力更新的話肯定會 T ,有一個比較顯然且比較重要的結論就是,每個點至多被遍歷一次,因為如果當某個點被遍歷過一次后,那么其相鄰的所有點肯定和當前的點都變為同一個顏色了,接下來無論如何操作,再遍歷這個點肯定是沒有任何進展的了,所以基于這個性質,我們可以用鏈表配合并查集實現模擬
首先并查集的 f 數組配合 find 函數用來維護每個點被染成的顏色,初始化為每個點本身,其次每個顏色都建立一個鏈表,用來儲存當前顏色下有多少個點被染成了相同的顏色
對于每一個詢問的顏色 x ,如果不存在的話,直接跳過即可,如果存在的話,可以遍歷一遍相應的鏈表進行擴展,根據上面的性質可知,遍歷過的元素直接刪除掉即可,對于新加入的元素,可以利用鏈表的 splice 方法,這個方法可以 O( 1 ) 合并兩個鏈表,如此一來,整體的時間復雜度也只是 O( n * a + m?),a 是并查集的時間開銷