这测试数据就水的nm离谱
因为使用的是冒泡排序,所以任何一种序列都可以通过交换达到状态
而对于确定的序列,每个数被交换的次数是确定的
开始朝向为右,结束时朝向也为右,说明每个数都移动了偶数个格子
不妨假设数字 a x a_x ax在不递减数组中可以落在 [ l , r ] [l,r] [l,r]位置(有 l l l个数小于 a x a_x ax, r − l + 1 r-l+1 r−l+1个数为 a x a_x ax)
若 x x x是奇数,那么最后只能换到 [ l , r ] [l,r] [l,r]中的奇数位置.当 x x x是偶数就只能换到偶数格子
对每种数判断一下即可
#include <bits/stdc++.h>
using namespace std;
const int maxn = 3e5+10;
int n,a[maxn],ok[maxn],c[maxn],ji[maxn][2];
int main()
{
int t; cin >> t;
while( t-- )
{
cin >> n;
for(int i=1;i<=n;i++) cin >> a[i],ok[a[i]]++;
for(int i=1;i<=100000;i++) c[i] = c[i-1]+ok[i];
for(int i=1;i<=n;i++) ji[a[i]][i&1]++;
int flag = 1;
for(int i=1;i<=100000;i++)
{
if( ok[i]==0 ) continue;
int odd = ( c[i]+1 )/2-( c[i-1]+1 )/2;
int even = ok[i]-odd;
if( ji[i][0]!=even ) flag = 0;
}
if( flag ) cout << "YES\n";
else cout << "NO\n";
for(int i=0;i<=100000;i++) c[i] = 0;
for(int i=1;i<=n;i++) ji[a[i]][i&1]--,ok[a[i]]--;
}
}