CF1851B 题解
题意:给定长度为 $ n $ 序列 $ a $,可以进行无限次操作,每次操作可以交换原序列中两个奇偶性相同的数,询问是否能将原序列升序排序。
小丑题。
注意到无论操作多少次,原序列是 奇数/偶数 的位置依然是 奇数/偶数,操作实际上就是把所有奇数排序,所有偶数排序。
那就可以先将原序列排序,再与原序列比较。设排序后数组为 $ b $。若存在一组 $ a_i , b_i $ 奇偶性不同,则不存在合法操作,反之则存在。
代码:
#include<bits/stdc++.h>
#define ll long long
#define MAXN 200010
using namespace std;
ll read(){
char ch=getchar();
ll s=0, w=1;
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){s=s*10+ch-'0';ch=getchar();}
return s*w;
}
ll n;
ll a[MAXN];
ll b[MAXN];
int main(){
ll T = read();
while(T--){
n = read();
for(ll i = 1; i <= n; i++){
a[i] = read();
b[i] = a[i];
}
sort(b+1, b+1+n);
bool f = true;
for(ll i = 1; i <= n; i++){
if((a[i] & 1 && !(b[i] & 1)) || (!(a[i] & 1) && b[i] & 1)){
f = false;
break;
}
}
cout << (f ? "YES" : "NO") << endl;
}
return 0;
}