思路
核心贪心:在从左到右构造答案时,每一步决定放当前剩余数中 最大 或 最小 的一个。
- 设当前可用的数是区间 L,L+1,…,R(初始 L=1,R=n)。
- 若把 R 放在当前位置,它会与之后剩下的 R−L 个更小的数各形成 1 个逆序对,因此本步能额外贡献 R−L 个逆序对。
- 若把 L 放在当前位置,本步不增加新的逆序对(因为后面剩下的都不小于 L)。
于是每一步贪心选择:
P3452.第2题-逆序对
题目内容
对于一个长度为 n 的数组 a= { a1,a2,...,an } ,如果 (i,j) 满足 1≤i<j≤n 且 ai>aj ,则 (i,j) 为逆序对。
牛牛有一个长度为 n 的排列 p= { 1,2,3,...,n } ,现在牛牛想重新排列 p 的顺序使得 p 中恰好包含 k 对逆序对,请你写一个程序帮牛牛解决该问题。
输入描述
一行输入两个正整数 n,k 。
1≤n≤1000,0≤k≤2n(n−1)
输出描述
一行输出由 n 个空格隔开的正整数 p1,p2,...,pn 表示重新排列后的排列 p 。
如果有多个答案,输出任意一个合法的即可。
样例1
输入
3 1
输出
1 3 2
说明
显然 {1,3,2 } 有 1 个逆序对 (3,2) ,同时 { 2,1,3 } 也满足要求。
样例2
输入
5 0
输出
1 2 3 4 5
说明
逆序对为 0 的排列只有这一个。