Codeforces Round #732 (Div. 2) C. AquaMoon and Strange Sort
原题链接
题意:给你一个长度为
n
n
n的数组,每个数组都有一个正负属性,一开始所有的属性都是正属性,你可以交换任意相邻的两个数。交换后这两个数的属性都会变。问你经过任意次交换后,是否可能将数组变成一个非递减数组,且所有数的属性都为正。
思路:对于奇数下标和偶数下标的数组单独来看,两个数的交换并不会影响他们的属性,也不会改变经过路途中的属性,所以我们可以直接将下标为奇数的数和下标为偶数的数分别存到两个vector中,再分别将两个vector排序,最后将原数组也排序,接着我们从1到n挨个判断就行。
代码:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
#define endl '\n'
const int N = 1e5+10;
int a[N];
void solve()
{
int n;
cin>>n;
vector<int> b;
vector<int> c;
for(int i=1;i<=n;i++)
{
cin>>a[i];
if(i%2) b.push_back(a[i]);
else c.push_back(a[i]);
}
sort(a+1,a+1+n);
sort(b.begin(),b.end());
sort(c.begin(),c.end());
for(int i=1;i<=n;i++)
{
if(i%2)
{
if(a[i]!=b[i/2])
{
cout<<"NO"<<endl;
return ;
}
}
else
{
if(a[i]!=c[i/2-1])
{
cout<<"NO"<<endl;
return ;
}
}
}
cout<<"YES"<<endl;
}
int main()
{
int t;
cin>>t;
while(t--)
{
solve();
}
}