#T0081. 星轨归位
0
星轨归位
题目背景
天仪阁的星盘上有 N 个星槽,编号 1…N;N 颗星石也编号 1…N,每个槽里恰有一颗星石。 现在的盘面是一个排列:槽 i 中停着星石 p_i。
星轨官想让每颗星石回到同号的星槽(槽 i 中最终是星石 i)。他有两类操作:
- 换轨(会磨损星石,应尽量少用):任选两颗星石交换位置,每次计 1 次操作。
- 连桥(预算有限,最多使用 K 次):在某一个“错位环”内部任选一处 原本需要一次换轨才能理顺的相邻错位关系,用一座桥把它直接理顺,计 1 次操作, 且不产生磨损。
把排列按“槽 i 指向槽 p_i”连边,可以分解成若干个互不相交的循环(cycle)。
- 长度为 1 的循环表示该星石已经归位,不需要操作;
- 长度为 L(L ≥ 2)的循环,理顺它恰好需要 L−1 次“理顺动作”: 每次动作可以选择用换轨(磨损 +1)或用一座桥替代(不磨损);
- 每个长度 L 的循环最多能用 L−1 座桥(动作数就这么多),总桥数不得超过 K。
题目描述
给定排列 p 与桥预算 K,输出两行:
- 理顺全部星石所需的最少总操作次数(换轨与连桥都算操作);
- 在连桥总数不超过 K 的前提下,最少换轨次数(尽量用桥替代换轨)。
输入格式
第一行两个整数 N、K(1 ≤ N ≤ 2×10⁵,0 ≤ K ≤ 2×10⁵)。 第二行 N 个整数 p₁…p_N,为 1…N 的一个排列。
输出格式
两行整数:第一行最少总操作次数;第二行最少剩余换轨次数。
样例输入 #1
5 2
2 3 1 5 4
样例输出 #1
3
1
样例解释 #1
排列有两个循环:(1→2→3→1) 长度 3、(4→5→4) 长度 2。 理顺共需 (3−1)+(2−1)=3 次动作,故总操作数为 3。 桥预算 K=2,可先用 2 座桥替代 2 次换轨,剩余 1 次必须换轨,故最少换轨为 1。
数据范围
- 1 ≤ N ≤ 2×10⁵,0 ≤ K ≤ 2×10⁵;p 为 1…N 的排列。
- 恒等排列(全部长度 1)两行答案均为 0。
冀公网安备13098402000493号