C. AquaMoon and Strange Sort(思维)
题目大意:
每个人都有一个朝向,初始时都向右,现在需要将他们按递增排序且最终仍然向右,只能交换相邻的两个人,且每次交换朝向就会相反,问能否实现。
思路:
首先由于朝向不变,那么我们肯定需要对每个数进行偶数次交换操作,那么这些操作对应到坐标上的话,就是说以前在奇数位置上的数,到最后也应该在奇数位置,偶数同理。所以我们将其位置分开储存,再将其排序,看看其最终位置与初位置是否对应即可。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<map>
#include<cmath>
#include<iomanip>
#include<queue>
using namespace std;
typedef long long ll;
const int p = 1e9 + 7;
typedef pair<int, int> pii;
const int N = 2e5+10;
int mp[N][2];
int a[N];
int main() {
int t;
cin >> t;
while (t--)
{
memset(mp, 0, sizeof mp);
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
mp[a[i]][i % 2]++;
}
sort(a + 1, a + 1 + n);
for(int i = 1; i <= n; i++)mp[a[i]][i % 2]--;
ll h1 = a[n],h2 = a[1];
int flag = 0;
for (int i = h2; i <= h1; i++) {
if (mp[i][0] || mp[i][1]) {
flag = 1;
break;
}
}
if (flag)puts("NO");
else puts("YES");
}
}