题目
给你一个数组A
ai代表每个元素的值,并且他们还具有方向,一开始都是朝右。
我们可以将相邻的数进行交换,但是每交换一次他们的方向会改变一次。
要求在任意次操作的情况下,能否让数组变成非递减并且方向一致朝右的情况。
题解思路
性质(突破点) : 要使方向不变必然要让这个数被交换偶数次。
要让这个数被交换偶数次。只能交换奇偶性质相同的点。
那中间的数的方向是否能保证?
例如3 2 1 交换 3 1
2 3 1 2 3
2 1 3 3 1
1 2 3 2 1
中间的数也只会被交换偶数次。即这个点被换到一个位置后需要换回来 必然是偶数次的。
所以 只需将 奇偶点分别排序
再看他们是否递增即可。
AC代码
#include <bits/stdc++.h>
//#include <unordered_map>
//priority_queue
#define PII pair<int,int>
#define ll long long
using namespace std;
const int INF = 0x3f3f3f3f;
const int N = 200100 ;
int n ;
int a[N] ;
int main()
{
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int T ;
cin >> T ;
while (T--)
{
vector <int> b1 ;
vector <int> b2 ;
cin >> n ;
for (int i = 1 ; i <= n ; i++ )
{
cin >> a[i] ;
if (i%2)
b1.push_back(a[i]);
else
b2.push_back(a[i]);
}
if (n == 1 )
{
cout<<"YES\n" ;
continue ;
}
sort(b1.begin(),b1.end()) ;
sort(b2.begin(),b2.end()) ;
bool falg = 1 ;
for (int i = 0 ; i < b2.size() ; i++ )
{
if (b2[i] < b1[i] )
falg = 0 ;
if (i + 1 < b1.size() && b2[i] > b1[i+1] )
falg = 0 ;
}
if (falg)
cout << "YES\n" ;
else
cout << "NO\n" ;
}
return 0 ;
}