news 2026/6/10 18:53:18

AtCoder E - Minimum Swap

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
AtCoder E - Minimum Swap

目录

一、前置基础:置换与置换环的核心概念

1. 置换环的定义与分解

循环分为两类:

2. 最小交换次数 K 的计算(核心公式)

(1)单个循环的最小交换次数

(2)整个排列的最小交换次数 K

二、交换操作对置换环与 K 的影响

(1)对循环结构的影响

(2)对 K 的影响

(1)对循环结构的影响

(2)对 K 的影响

三、题目核心:合法首次操作的判定与计数

四、代码


E - Minimum Swaphttps://atcoder.jp/contests/abc436/tasks/abc436_e

本文将置换环的核心理论与题目要求深度结合,从原理推导到题目解法形成完整逻辑链,涵盖置换环的分解、最小交换次数的计算、交换操作对循环的影响,以及最终题目答案的推导。


一、前置基础:置换与置换环的核心概念


对于一个长度为 N 的排列 P(P 是 1,2,…,N 的一个排列,即每个数恰好出现一次),置换环是描述排列无序性的核心工具。


1. 置换环的定义与分解


排列的本质是位置到值的映射关系:对于位置 i,P [i] 表示该位置上的数值。从任意位置 i 出发,沿着 i → P [i] → P [P [i]] → … 的路径遍历,直到回到起始位置 i,这条闭合路径就构成一个置换环(简称循环)。


循环分为两类:


自环:若 P [i] = i,则 i 自身构成一个长度为 1 的循环(元素已在正确位置,无操作意义)。
非自环:若 P [i] ≠ i,则遍历路径形成长度≥2 的循环(元素需要交换才能归位)。
示例:
排列 P = [3,1,4,2,5](位置 1~5):循环 1:1 → 3 → 4 → 2 → 1(长度 4,非自环);
循环 2:5 → 5(长度 1,自环)。
排列 P = [2,1,4,3](位置 1~4):循环 1:1 → 2 → 1(长度 2,非自环);
循环 2:3 → 4 → 3(长度 2,非自环)。


2. 最小交换次数 K 的计算(核心公式)


将排列还原为有序序列 (1,2,…,N) 的最小交换次数,由置换环的结构决定:


(1)单个循环的最小交换次数


对于一个长度为 len 的非自环循环,要将其所有元素还原到正确位置,需要 len - 1 次交换。
原理:每一次交换最多能让循环的长度缩短 1,最终剩余 1 个元素时无需交换,因此总次数为 len - 1。
示例:长度 2 的循环需 1 次交换,长度 4 的循环需 3 次交换。


(2)整个排列的最小交换次数 K


设排列分解后有:
m 个非自环循环(长度分别为 len₁, len₂, …, lenₘ);
S = sum (lenᵢ):所有非自环元素的总数(即所有长度≥2 的循环的长度之和)。
则整个排列的最小交换次数为:
K = Σ(从 i=1 到 m)(len_i - 1) = S - m
这是后续分析的核心公式,建立了置换环与最小交换次数的直接关联。
示例验证:
排列 [3,1,4,2,5]:S=4,m=1,则 K=4-1=3;
排列 [2,1,4,3]:S=4,m=2,则 K=4-2=2。


二、交换操作对置换环与 K 的影响


题目中允许的操作是:选择任意 i<j,交换 P [i] 和 P [j]。不同位置的交换会对置换环的结构产生不同影响,进而改变最小交换次数 K。
1. 情况 1:交换同一非自环循环内的元素


(1)对循环结构的影响


原循环(长度 len)会拆分为两个新的循环(长度为 a 和 b,满足 a + b = len)。
原理:交换环内两个点的映射关系,相当于在环上 “切两刀”,将一个闭合环拆分为两个独立的小环,总长度保持不变。
示例:循环 1→3→4→2→1(长度 4),交换位置 2 和 3 的元素后,拆分为 1→3→1(长度 2)和 2→4→2(长度 2)。


(2)对 K 的影响


非自环元素总数 S:不变(仅循环拆分,元素数量无增减);
非自环循环数量 m:增加 1(一个变两个,m' = m + 1);
新的最小交换次数 K':
K' = S - m' = S - (m + 1) = K - 1


结论:交换同一循环内的元素,会让最小交换次数减少 1。
2. 情况 2:交换不同非自环循环内的元素


(1)对循环结构的影响


两个原循环(长度 len₁和 len₂)会合并为一个新的循环(长度 len = len₁ + len₂)。
原理:交换两个独立环的元素,相当于用这两个元素作为 “桥梁”,将两个环连接成一个更大的闭合环,总长度为原两环长度之和。
示例:循环 1→2→1(长度 2)和 3→4→3(长度 2),交换位置 1 和 3 的元素后,合并为 1→4→3→2→1(长度 4)。


(2)对 K 的影响


非自环元素总数 S:不变(仅循环合并,元素数量无增减);
非自环循环数量 m:减少 1(两个变一个,m' = m - 1);
新的最小交换次数 K':
K' = S - m' = S - (m - 1) = K + 1


结论:交换不同循环内的元素,会让最小交换次数增加 1。


三、题目核心:合法首次操作的判定与计数


1. 题目要求回顾


设 K 为将 P 还原为有序的最小交换次数;需统计合法的首次操作数:选择 (i,j) 作为首次操作后,能通过后续操作让总操作次数恰好为 K(最小次数)。


2. 合法首次操作的约束条件


首次操作用了 1 次,设后续还原所需的最小交换次数为 K',则总操作次数为 1 + K'。要让总次数恰好为 K,必须满足:1 + K' = K → K' = K - 1即:合法的首次操作必须让交换后的最小交换次数 K' = K - 1。

所以只能在同一循环内交换

四、代码

#include <bits/stdc++.h> using namespace std; #define int long long // priority_queue<int, vector<int>, greater<int> > q; const int N = 4e5+10; const int inf=1e9; int p[N]; void solve() { int n; cin >> n; for (int i = 1; i <= n; i++) { cin >> p[i]; } bool st[n+1]={false}; long long ans = 0; for (int i = 1; i <= n; i++) { if (!st[i]) { int c = i; int len = 0; while (!st[c]) { st[c] = 1; c = p[c]; len++; } ans += len * (len - 1) / 2; } } cout << ans << endl; } signed main() { int q=1; // cin >> q; while (q--) { solve(); } return 0; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 17:43:31

小白必看:Windows蓝屏日志分析入门指南

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 制作一个交互式蓝屏分析学习应用&#xff0c;通过分步向导引导新手完成日志分析。要求包含常见错误代码的图文解释库、模拟dmp文件分析练习、错误解决流程图&#xff0c;并提供一键…

作者头像 李华
网站建设 2026/6/10 2:37:08

零基础入门:用Keras和快马开发你的第一个AI模型

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 为完全新手设计一个最简单的Keras教程&#xff0c;创建一个手写数字识别模型。要求分步骤指导&#xff1a;1)加载MNIST数据集 2)数据预处理 3)构建最简单的全连接网络 4)训练模型 5…

作者头像 李华
网站建设 2026/6/10 18:44:54

如何用paraphrase-multilingual-minilm-l12-v2提升多语言文本处理效率

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个基于paraphrase-multilingual-minilm-l12-v2模型的文本改写工具&#xff0c;支持多种语言的输入和输出。用户可以输入一段文本&#xff0c;选择目标语言&#xff0c;系统自…

作者头像 李华
网站建设 2026/6/10 18:44:54

ABB 3BUS217846-2500模块:工业网络的精确同步引擎

ABB 3BUS217846-2500 是ABB S800系列 或兼容的 Freelance/AC 800F 分布式控制系统&#xff08;DCS&#xff09;中&#xff0c;为 DigiVis/VisNet 现场总线网络设计的高性能光纤环网交换机/介质转换器模块。它是构建高可靠、高确定性和大范围工业控制网络的关键通信基础设施&…

作者头像 李华
网站建设 2026/6/9 19:15:11

AI如何自动生成DLL Escort许可证密钥验证系统

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个DLL Escort许可证密钥验证系统&#xff0c;使用AI自动生成C#代码&#xff0c;包含以下功能&#xff1a;1. 密钥生成算法&#xff08;基于用户硬件信息&#xff09;&#xf…

作者头像 李华
网站建设 2026/6/10 18:44:50

代码随想录 109.冗余连接Ⅱ

一、思路&#xff1a;&#xff08;1&#xff09;本题和684.冗余连接类似&#xff0c;但本题是一个有向图&#xff0c;相对要复杂一些。&#xff08;2&#xff09;题目要求&#xff1a;有一个有向图&#xff0c;是由一棵有向树 一条有向边组成的&#xff08;所以此时这个图就不…

作者头像 李华