AtCoder 🟢 ABC436E Minimum Swap
題目的難度顏色使用 Luogu 上的分級,由簡單到困難分別為 🔴🟠🟡🟢🔵🟣⚫。
ABC436E Minimum Swap
Problem Statement
題目簡述
給定一個長度為 的排列 。
目標是透過交換 中任意兩個元素的操作,將其排序為 。
令 為將 排序所需的最少交換次數。
請計算有多少對 () 滿足:若第一步交換 與 ,則後續僅需 次操作即可完成排序?
具體描述
換句話說,請問有多少組 可以做為「最優交換」的第一步?
Constraints
約束條件
- 為長度 的排列,且保證 。
思路:置換環 (Cycle Decomposition)
這道題可以轉化為 置換環 (Cycle Decomposition) 的圖論問題。
我們可以將排列 建構成一個有向圖,其中每個節點 有一條有向邊指向 。由於每個節點的出度與入度皆為 1,此圖必然由若干個不相交的環 (Disjoint Cycles) 構成。
根據置換群的性質,將一個排列排序所需的最小交換次數 為:
其中 是元素總數, 是環的總數(包含長度為 1 的自環)。
證明:為什麼 ?
- 目標狀態:一個完全排序的序列 等價於圖中有 個自環,即 。此時 。
- 操作影響:對於任意一次交換 :
- 若 在同一個環內(裂解):該環會斷裂成兩個獨立的環。環的總數 增加 1,距離目標 更近一步(剩餘次數 )。
- 若 在不同的環內(合併):這兩個環會合併成一個大環。環的總數 減少 1,距離目標 更遠一步(剩餘次數 )。
- 結論:為了以最少次數 達到目標,我們必須每次操作都讓環數 (即每次都進行裂解)。
因此,題目要求「第一步操作後剩餘次數為 」,等價於要求這一步操作必須是「裂解」操作。這意味著我們選取的 必須位於同一個環中。
解題策略
我們只需要找出所有的環,計算每個環內有多少對不同節點 即可。
演算法流程
- 建立一個
vis陣列標記節點是否已訪問。 - 遍歷 到 的每個節點 :
- 若 尚未訪問,表示發現一個新的環。
- 沿著 遍歷該環,同時計算環的大小(節點數),並標記經過的節點為已訪問。
- 對於大小為 的環,其內部的任兩點交換都是合法操作,故對答案的貢獻為 。
- 累加所有環的貢獻即為最終答案。
複雜度分析
- 時間複雜度:。每個節點在尋找環的過程中只會被訪問一次。
- 空間複雜度:。需要維護
vis陣列來標記已訪問的節點,以及存儲輸入的排列 。
Code
1 | def solve(): |
寫在最後
PROMPT
本部落格所有文章除特別聲明外,均採用CC BY-NC-SA 4.0 授權協議。轉載請註明來源 十六個天亮!
評論
WalineGiscus







