题目
借鉴
- 题意
题目大意:给一个长度为n的数组a[n],每个元素还有一个朝向,开始都为右。每次你可以调换两个相邻元素的位置,并使两个元素方向转向另一个方向(左->右,右<-左),问在所有元素均指向右向的条件下,能否使原数列单调递增。
- 思路
要令一个元素能能指向右向,则一定被进行了偶数次操作;那么在操作之后,每一个的奇偶性必然发生改变。所以可以统计每个数的在原序列和排序后的序列中的奇偶位置的个数。
- 代码
#include<bits/stdc++.h>
using namespace std;
int T,n,a[100010],f[2][100010];
int main()
{
scanf("%d",&T);
while (T--) {
scanf("%d",&n);
memset(f,0,sizeof(f));
for (int i=1;i<=n;i++) {
scanf("%d",&a[i]);
f[i%2][a[i]]++;
}
sort(a+1,a+n+1);
for (int i=1;i<=n;i++) f[i%2][a[i]]--;
int flag=1;
for (int i=1;i<=100000;i++) if (f[0][i]||f[1][i]) flag=0;
printf("%s\n",flag?"YES":"NO");
}
return 0;
}