# | Submission time | Handle | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
917506 | 2024-01-28T10:57:09 Z | coding_snorlax | Swapping Cities (APIO20_swap) | C++14 | 0 ms | 0 KB |
// 精神滿分解 // 可持久化並查集*2 // 先將所有權重由小到大排序,之後依次加入第一個並查集,同時記錄並查集中的邊總數(以Boss[flag]紀錄是否超過一條非樹的邊) // 若增邊操作連接兩個原先相同Boss的集合,且flag=0,則將該並查集中所有邊加入第二個並查集,並統一設定權重為當下的新增邊 // 若增邊操作連接兩個原先相同Boss的集合,且flag=1,忽略該操作 // 若增邊操作連接兩個原先不同Boss的集合,且某個flag=1,另一個為0,則將為0的集合內所有點加入第二個並查集,同時在第一個並查集連接該邊,flag設為1 // 若增邊操作連接兩個原先不同Boss的集合,且flag均為1,則在第二個並查集加入該邊 // 若增邊操作連接兩個原先不同Boss的集合,且flag均為0,則在第一個並查集加入該邊 // 最後利用第二個可持久化並查集查詢每個詢問是在何時連通即可 // 注意:對於第一個並查集,必須知道所有元素,故不可狀態壓縮,且需要反向建邊,使可從Boss做dfs至每個非Boss的點