C. AquaMoon and Strange Sort

博客讨论了一道编程竞赛题目,要求判断在有限操作下能否将两个数组排序且保持元素属性。作者最初尝试使用归并排序计算逆序对,但未能解决问题。最终AC的解决方案是检查奇偶位置的元素是否可以独立排序。代码中展示了如何通过比较奇偶位置的排序状态来确定答案。

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;

	}
}

如有问题请指出,本人虚心听教。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值