我们需要构造一个 1 到 n 的排列,使得它的逆序对总数(混乱度)恰好等于 k。
最大可能的逆序对数为 2n(n−1),题目保证给出的 k 在合法范围内。
可以采用贪心策略从大到小放置数字。设当前剩余未使用的数字集合为 {1,2,…,s}(s 初始为 n)。
某部队有 n 名士兵,编号依次为 1 到 n。现在需要将他们排成一列。
我们定义一种“混乱度”:对于队列序列 a1,a2,…,an,如果存在一对位置 (i,j) 满足 i<j 且 ai>aj,则称这对士兵构成一个倒置。整个队列中所有倒置的总数,就是该队列的混乱度,记为 k。
给定 n 和一个目标混乱度 k,请你输出任意一个 1 到 n 的排列作为队列,使得其混乱度恰好等于 k。
约束条件
第一行包含一个整数 T(1≤T≤2×105),表示测试用例的个数。 接下来 T 行,每行包含两个整数 n 和 k,分别表示士兵的数量和要求的混乱度。
对于每个测试用例,输出一行,包含 n 个空格分隔的整数,表示士兵的排列序列。该序列应当是 1 到 n 的一个排列,且混乱度恰好等于 k。 如果有多组合法解,输出任意一组即可。
输入
1
3 2
输出
3 1 2
说明
共有 3 名士兵,目标混乱度 2。最大可能逆序对数为 23×2=3。
构造排列 [3, 1, 2]:第一个数 3 比后面的 1 和 2 都大,形成 2 个逆序对 (3,1) 与 (3,2);1 比后面的 2 小,不产生新逆序对。因此混乱度恰好为 2,满足要求。
输入
1
1 0
输出
1
说明
只有 1 名士兵的队伍,不可能存在任何逆序对。目标混乱度只能为 0,排列 [1] 是唯一合法解。
输入
1
4 5
输出
4 3 1 2
说明
4 名士兵,目标混乱度 5。最大可能逆序对数为 24×3=6。
构造排列 [4, 3, 1, 2]:4 与后面的 3、1、2 构成 3 个逆序对;3 与后面的 1、2 构成 2 个逆序对;1 与 2 正序,无新增。混乱度为 3+2=5,符合要求。
输入
1
5 10
输出
5 4 3 2 1
说明
5 名士兵,目标混乱度为最大值 (25)=10。完全逆序排列 [5, 4, 3, 2, 1] 中任意两个元素都构成逆序对,总数为 10,恰好满足要求。
By signing up a CodeFun2000 universal account, you can submit code and join discussions in all online judging services provided by us.