0
点赞
收藏
分享

微信扫一扫

牛客练习赛97 特别的玛格丽特 ( 排序 关于如何把数拿出来排序之后放回原来位置的做法)

链接:登录—专业IT笔试面试备考平台_牛客网

题目描述

给定一个数组。每次可以交换数组中两个奇数或者两个偶数,可以交换无数次。问最后是否能把数组变成非降序数组?

用数学语言来说,对于数组aaa,每次可以交换 aia_iai​ 和 aja_jaj​ ,当且仅当i≠ji≠ji​=j 且 (ai−aj) mod 2=0(a_i-a_j)\ mod\ 2=0(ai​−aj​) mod 2=0。问经过一些操作后,最终是否能使得数组满足:对于 i∈[1,n)i∈[1,n)i∈[1,n),ai≤ai+1a_i\leq a_{i+1}ai​≤ai+1​?

输入描述:

第一行输入一个正整数 nnn ,代表数组的长度。
第二行输入 nnn 个正整数 aia_iai​ ,代表拿到的数组。
1≤n,ai≤1001\leq n ,a_i \leq 1001≤n,ai​≤100

输出描述:

如果最终能使数组变成非降序,则输出"Yes"。否则输出"No"。

示例1

输入

5 3 2 1 4 5

输出

Yes

示例2

输入

5 1 3 2 2 5

输出

No

简单的奇偶排序。把下标存入一个数组,排序后再用数组下标中的信息插回去就行了。

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ll long long
#define fast std::ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);

inline int read()
{
    int x=0,k=1; char c=getchar();
    while(c<'0'||c>'9'){if(c=='-')k=-1;c=getchar();}
    while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+(c^48),c=getchar();
    return x*k;
}
const int maxn=1e6+10;
int n,m,k,tot,num[maxn],cnt[maxn];
vector<int>a[2],b[2]; 
signed main(){
	fast
	int n;cin>>n;
	for(int i=1;i<=n;i++){
		cin>>k;a[k&1].push_back(k);
		b[k&1].push_back(i);
	}
	sort(a[0].begin(),a[0].end());
	sort(a[1].begin(),a[1].end());
	int cnt=0;
	for(int i=0;i<a[0].size();i++){
		num[b[0][i]]=a[0][i];
	}
	for(int i=0;i<a[1].size();i++){
		num[b[1][i]]=a[1][i];
	}
	for(int i=1;i<n;i++){
		if(num[i]>num[i+1])
		{
			cout<<"No\n";
			return 0;
		}
	}
	cout<<"Yes\n";
}
举报
0 条评论