CF27C 题解

题意翻译:

如果一个序列是递增或递降的(相等也算增或降),则称它为有序的。给定一个序列,找出最短的非有序的子序列。子序列可以不连续。

解析:

情况 结果 原因
\(N \le 2\) 无解 元素只可能是单调的
在序列中有 \(a_x \le a_y\) 且 \(a_y \ge a_z\) 或 \(a_x \ge a_y\) 且 \(a_y \le a_z\) 的情况 一定有解 这些元素形成无序的情况

我们明显要着重分析 \(N \ge 3\) 情况:
我们首先需要的是分析是否存在 \(a_1 \le a_i\) 且 \(a_i \ge a_j\) 或 \(a_1 \ge a_i\) 且 \(a_i \le a_j\) 的情况。
Q:为啥是这样?

CF27C 题解

如果有解,第一个是 \(a_1\)。

再简化:是否存在 \(a_1 \le a_i\) 且 \(a_i \ge a_{i+1}\) 或 \(a_1 \ge a_i\) 且 \(a_i \le a_{i+1}\) 的情况。

Q:为啥是这样?

因为:

  1. 如果 $a[i]>a[i+1]$:
     如果 $a[1]$ 是三者最大,呈降序,不符合条件,舍去。
     如果 $a[1]$ 居中,满足“小大小”无序。
     如果 $a[1]$ 是三者最小,同上。
    

    --by ahawzlc

所以仅需枚举 \(1\) 至 \(N\) 即可。

CODE:

#include <iostream>
using namespace std;
int a[100001];
int main(){
	cin.tie(0);
	cout.tie(0);
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	for(int i=2;i<n;i++)
	{
		if((a[i+1]>a[i]&&a[i]<a[1])||(a[i+1]<a[i]&&a[i]>a[1])){	
		cout<<3<<endl<<1<<' '<<i<<' '<<i+1;
		return 0;
		}
	}
	cout<<"0\n";
    return 0;
}
上一篇:CF527D 题解


下一篇:数学学习笔记4