题意:
给出一个数列,只能交换相邻的两个数,得到一个非递减数列,保证每个数交换的次数必须是偶数,如果不是偶数则输出NO;
思路:
因为只能交换相邻的两个数且每个数的交换次数是偶数,所以可以得出排序前后,数的下标的奇偶性没变
;
开一个二维数组记录一下即可,第一维是这个数的值,第二维是这个数下标的奇偶性;
Code:
#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdio>
#include <string>
#include <algorithm>
#include <queue>
#include <utility>
#include <stack>
#include <map>
#include <vector>
#include <set>
#include <iomanip>
#define hz020 return
#define mes memset
#define mec memcpy
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<ll, ll>pii;
const int N = 100010;
const int null = 0x3f3f3f3f,INF = 1e9;
const ll mod = 998244353;
int T;
int n;
int a[N];
int st[N][2];
ll gcd(ll a,ll b)
{
return b ? gcd(b,a % b) : a;
}
int main()
{
cin >> T;
while(T --)
{
mes(st,0,sizeof st);
cin >> n;
for(int i = 1;i <= n;i ++)
{
cin >> a[i];
st[a[i]][(i & 1)] ++;
}
sort(a + 1,a + 1 + n);
int f = 0;
for(int i = 1;i <= n;i ++)
{
st[a[i]][(i & 1)] --;
if(st[a[i]][(i & 1)] < 0)
{
f = 1;
break;
}
}
if(f) puts("NO");
else puts("YES");
}
hz020 0;
}