0
点赞
收藏
分享

微信扫一扫

WFU个人训练赛codeforces732(div2)

东言肆语 2022-03-12 阅读 26
算法

C.C

 

题意:

一列数,每个数有方向,向左或者向右,初始方向都是向右。可以选择相邻的两个数交换位置,两个数的方向要取反。
问,是否可以将数列交换成非递减数列,并且每个数的方向都向右?

题解:

推断可以发现,奇数位与奇数位的数字通过一定方法交换是不会改变方向的,即奇数位数可以随意调换,偶数位数可以随意调换,于是我们可以将奇数位的数放在一个数组里,把偶数位数放在一个数组里,然后对他们进行排序,然后奇数位偶数位奇数位偶数位这样交叉存入一个数组,看这个数组是否可以成非递减数列,如果可以,“YES”

AC代码:

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int a[N],ji[N],ou[N];
int main()
{
	int t;
	cin>>t;
	L:while(t--)
	{
		int n;
		cin>>n;
		int j=0,o=0;
		for(int i=1;i<=n;i++)
		{
			int x;
			cin>>x;
			if(i%2)
			{
				ji[j]=x;
				j++;
			}
			else
			{
				ou[o]=x;
				o++;
			}
		}
		sort(ji,ji+j);
		sort(ou,ou+o);
		//for(int i=0;i<j;i++)
	//	cout<<ji[i]<<' ';
		//for(int i=0;i<o;i++)
		//cout<<ou[i]<<' ';
		j=0,o=0;
		
		for(int i=0;i<n;i++)
		{
			if(i%2)
			{
				a[i]=ou[o];
				o++;
			}
			else
			{
				a[i]=ji[j];
				j++;
			}
		}
		for(int i=0;i<n-1;i++)
		{
			if(a[i]>a[i+1])
			{
				cout<<"NO"<<endl;
				goto L;
			}
		}
		cout<<"YES"<<endl;
	}
	return 0;
}
举报

相关推荐

0 条评论