451B. Sort the Array

该博客介绍了如何解决一个编程竞赛题目,题目要求判断通过翻转数组的某一段是否能使数组变为递增顺序。博主提供了算法思路和代码实现,通过复制原数组并排序,找出不一致的区间,然后检查区间内的元素是否符合翻转条件。
摘要由CSDN通过智能技术生成

链接:

https://codeforces.com/problemset/problem/451/B

题意

给你一个长度为n的数组,判断是否可以通过翻转某一段的方式使变化后的数组是从小到大排序的递增数组。(如果可以输出yes,区间左值和区间右值(从1开始),不行输出no)
1 ≤ n ≤ 105
a[1], a[2], …, a[n] (1 ≤ a[i] ≤ 109)

Example

input
3
3 2 1
output
yes
1 3
input
4
2 1 3 4
output
yes
1 2
input
4
3 1 2 4
output
no
input
2
1 2
output
yes
1 1

解析

这题可以在输入数组的时候复制一个原数组,然后将原数组从小到大排序,然后遍历比较两个数组,第一个不一样的位置是区间左值,最后一个是区间右值。最后遍历区间里,变化后的数组和原数组是否成对称(翻转)关系,即对比在区间[l, r]内,满足:原来数组[l + i] = 变化数组[r - i],如果中间出现不一样的,就说明不行。

#include <iostream>
#include <algorithm>

using namespace std;

const int N = 1e5 + 10;
int q[N], tem[N];

int main()
{
	int n;
	cin >> n;

	for (int i = 1; i <= n; i++)
	{
		cin >> q[i];
		tem[i] = q[i];
	}

	sort(tem + 1, tem + n + 1);
	int l = 0, r = 0;

	for (int i = 1; i <= n; i++)
	{
		if (q[i] != tem[i])
		{
			l = i;
			int j = n;
			while (q[j] == tem[j])
			{
				j--;
			}
			r = j;
			break;
		}
	}

	if (l == 0) l = 1;
	if (r == 0) r = 1;
 
	for (int i = l, j = r; i < r; i++, j--)
	{
		if (q[i] != tem[j])
		{
			cout << "no";
			return 0;
		}
	}
	
	cout << "yes" << endl << l << ' ' << r;

	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值