https://codeforces.com/contest/1546/problem/C
众所周知CN round都很坑,想得到秒切,想不到送命

INPUT
3
4
4 3 2 5
4
3 3 2 2
5
1 2 3 5 4
OUTPUT
YES
YES
NO

题意
给T,给n,接下来是两排长度为n的数组,每个数组的位置有正负的属性,一开始全部都是正的,你可以任意 交换 两个相邻的数,但被操作的俩个数 属性 会改变,目的是判断是否能 排成从小到大的顺序同时属性都是 正
我的错误思路:
第一这是排序问题,所以想到归并排序操作一下,统计逆序对,然后判断一下就能出,看来我还是太年轻了
大佬ac思路:
既然是判断是否能变成有序并且属性不改变加之又不要求最小步数,我们发现,奇数坐标和偶数坐标上的交换既不会改变交换的两个数的属性,同时又不改变路途经过的属性,所以我们直接判断能否构造一个奇偶数列就行(建议看代码)
(大佬的思路就是新奇)
AC代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn = 1e5 + 9;
int a[maxn];
vector<int>b, c;
int main()
{
int t;
cin >>t;
while (t--)
{
b.clear(), c.clear();
int n;
cin >> n;
for (int i = 0; i < n; i++) cin >> a[i];
for (int i = 0; i < n; i++)
{
if (i % 2 == 1)
b.push_back(a[i]);
else
c.push_back(a[i]);
}
sort(a, a + n);
sort(b.begin(), b.end());
sort(c.begin(), c.end());
bool f = true;
for (int i = 0; i < n; i++)
{
if (i % 2 == 1)
{
if(a[i] != b[i / 2])
{
f = false;
break;
}
}
else
if(a[i] != c[i / 2])
{
f = false;
break;
}
}
if (f)
cout << "YES" << endl;
else
cout << "NO" << endl;
}
}
如有问题请指出,本人虚心听教。
博客讨论了一道编程竞赛题目,要求判断在有限操作下能否将两个数组排序且保持元素属性。作者最初尝试使用归并排序计算逆序对,但未能解决问题。最终AC的解决方案是检查奇偶位置的元素是否可以独立排序。代码中展示了如何通过比较奇偶位置的排序状态来确定答案。
777

被折叠的 条评论
为什么被折叠?



