本题的核心在于分析交换操作的免费条件,并根据不同的 k 取值,将最少体力消耗转化为不同的逆序对统计问题。货箱的优先级编号恰好是 1 到 n 的一个排列,记为 a1,a2,…,an。
情况一:k≥3 由于交换时优先级差的绝对值大于 1 时不消耗体力,且允许交换的两个货箱优先级差值最大为 k(至少为 3)。借助差值为 2 或以上的免费交换,可以在不消耗任何体力的情况下连通任意两个货箱,并完成整个排列的排序。因此答案为 0。
情况二:k=1 此时只允许交换优先级差值为 1 的货箱,每次交换恰好消耗 1 单位体力。这等价于只能进行相邻元素的交换。将一个排列通过相邻交换变为升序所需的最少交换次数,等于原排列的逆序对总数。每消除一个逆序对至少需要一次相邻交换,而存在一种交换顺序使得总消耗恰好等于逆序对数。因此答案为 ∑1≤i<j≤n[ai>aj],可以使用归并排序在 O(nlogn) 时间内求出。
你面前有一排 n 个货箱,每个货箱上贴有一个唯一的优先级编号,这些编号恰好是 1 到 n 的一个排列。第 i 个货箱的优先级为 ai。你希望将货箱按照优先级从小到大的顺序重新排列(即最终排列为 1,2,…,n)。
由于货架空间的限制,每次你只能选择两个优先级相差不超过 k 的货箱,并交换它们在序列中的位置。交换时,若两个货箱的优先级之差的绝对值为 1,你会因为操作精细而消耗 1 单位体力;若差的绝对值大于 1,则不消耗体力。
请你计算,想要完成排序,最少需要消耗多少体力。
数据范围:货箱数量 n 满足 4≤n≤2×105,操作限制参数 k 满足 1≤k≤n−1。优先级序列 a1,a2,…,an 是 1 到 n 的一个排列。
By signing up a CodeFun2000 universal account, you can submit code and join discussions in all online judging services provided by us.