传送门:Problem - B - Codeforces
题意:给定由 n 个元素组成的数组,现给定操作 选取索引 i j ,如果 abs( i - j ) >= x 就可以交换 swap( a[i] , a[j] ),可以进行任意次操作,如果操作后的数组是不递减的输出 " YES " , 否则输出 "NO"
思路:当 x <= n / 2 时,此时可以任意交换两个元素
当 x > n / 2 时, a[1] ... a[ n - x ] 可以与 a[ x + 1 ] .... a[ n ] 交换元素
则 a[ n - x + 1 ] .. a[ x ] 不能交换,所以只需要判断这个范围内是否有序即可
#include<bits/stdc++.h>
using namespace std;
#define lowbit(x) ( x & -x )#define int long long
typedef long long ll;
typedef pair<int, int> pii;void solve()
{int n , x; cin >> n >> x;vector<int> a(n + 1);for( int i = 1 ; i <= n ; i++ ) cin >> a[i];auto b = a;if( 2 * x <= n )puts("YES");else{sort( b.begin() + 1 , b.end() );bool flag = true;for( int i = n - x + 1 ; i <= x ; i++ ){if( a[i] != b[i] ) flag = false;}if( flag )puts("YES");else puts("NO");}
}
signed main()
{int tt = 1;cin >> tt;while (tt--)solve();return 0;
}