C. No More Inversions
大致题意:
一个a数组,内容为1 2 3 4 … k-1 k k-2 … k-(n-k)
有一个数组p,大小为k,且里面的值为k的一个全排列。(a[i]∈[0,k]) 问寻找一个数组p,使得对于i∈[1,n]
有b[i]=p[a[i]]满足b数组的倒置数目不能超过n,且让b的字典序最大(一个倒置为存在一个i,j,i<j使得a[i]>a[j]
即逆序数)
思路:
看将数组a分为两个部分
- 1 2 3 4 … k-(n-k)-1
- K-(n-k) k-(n-k)+1 … k k-1 … k-(n-k) 注意到第二部分数组a是关于k对称的,也就是说对于任意i,j∈[k-(n-k) k]取不同值,都存在一个倒置,a[i] a[j] a‘[j]
a’i a[i] a`[j]不倒置 则a[j] a’[i]必倒置 这样 无论在第二部分中
也即p中下表为k-(n-k)到k之间取值如何 b和a数组中的倒置数目始终相同 无需考虑 看第一部分 需要让b和a数组一样 才能保证倒置一样
又考虑到最大字典序,所以第二部分逆序输出即可。
代码:
#include<algorithm>
#include<iostream>
#include<cstring>
#include<string>
#include<queue>
#include<map>
#include<cstdio>
#include<cmath>
#include<stdlib.h>
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const int maxn = 1e6+50;
int main(){
int t;
cin >> t;
while(t--){
int n,k;
cin >> n >> k;
for(int i = 1;i < 2*k-n;i++) cout << i << ' ';
// 2*k-n即可 k-(n-k)的变形
for(int i = k;i >= 2*k-n;i--) cout << i << ' ';
//空格格式要求不是很严格
cout << endl;
}
return 0;
}