题目大意:给定n个数,可以进行任意次相邻数交换,目标序列是不递增序列,问对于每个数能否用偶数次操作使得它们回到目标位置上。
思路:
如果序列没有重复数,那么原位置和目标位置是明确的,看一下距离是否都为偶数即可。有重复数时易知原序列的数在奇数位置上,最后必回到奇数位置上,偶数同理,我们统计一下重复数原来在奇数位置上的个数,和在目标序列中奇数位置上的个数是否相等即可。
#include<bits/stdc++.h>
using namespace std;
#define N 100005
int arr[N];
int b[N];
int t, n;
int cnt[N];
int main()
{
cin >> t;
while (t--)
{
cin >> n;
memset(cnt, 0, sizeof(cnt));
for (int i = 1; i <= n; i++)
{
cin >> arr[i];
b[i] = arr[i];
}
sort(b + 1, b + n + 1);
for (int i = 1; i <= n; i += 2)
{
cnt[arr[i]]++;
cnt[b[i]]--;
}
bool flag = 1;
for (int i = 1; i <= 100000; i++)
{
if (cnt[i])
{
flag = 0;
break;
}
}
puts(flag ? "Yes" : "No");
}
return 0;
}