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;
}
posted @ 2023-07-28 08:57  象征阳光  阅读(13)  评论(0)    收藏  举报  来源