题目大意:
给你一个数组,问你是否能在x距离内,交换元素,得到递减的序列,该交换操作可以进行多次,复制一份数组,将原数组排序,然后两个数组比较跑循环,看能不能在范围里进行交换操作,不能就直接输出NO。
#include <iostream>
#include <algorithm>
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
const int mx = 1e6 + 9;
int a[mx], tmp[mx];
bool dd(int len) {
for (int i = 0; i < len; i++) {
if (a[i] != tmp[i]) {
return 0;
}
}
return 1;
}
int main() {
IOS;
int t, n, k;
cin >> t;
while (t-- && cin >> n >> k) {
for (int i = 1; i <= n; i++) {
cin >> a[i];
tmp[i] = a[i];
}
sort(a + 1, a + n + 1);
//特判,如果数组本身就是递减的,就直接输出答案
if (dd(n)) {
cout << "YES" << "\n";
}
else {
if (n <= k) {
cout << "NO" << "\n";
continue;
}
int cnt = 0;
for (int i = 1; i <= n; i++) {
cnt++;
if (a[i] != tmp[i]) {
if ((i - k > 0) || (i + k <= n)) {
continue;
}
else {
cout << "NO" << "\n";
break;
}
}
}
if (cnt == n) {
cout << "YES" << "\n";
}
}
}
}