题解:如果有答案必定长度为3 子序列答案为一个山峰或者山谷的形状
#include<bits/stdc++.h>
using namespace std;
int a[100010];
int l[100010],w[100010]; //l表示当前点为最低点,左边比他大的数的下标,没有就是0 w表示最高点
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
int maxx=a[1];
int idx=1;
for(int i=2;i<n;i++)
{
if(maxx>a[i]) l[i]=idx; //如果左边有比他大的就赋值
if(a[i]>maxx){ //更新最大值
maxx=a[i];
idx=i;
}
}
maxx=a[n];
idx=n;
for(int i=n-1;i>1;i--)
{
if(maxx>a[i]&&l[i]){ //如果右边有比他大的而且左边也有,输出答案
cout<<3<<endl;
cout<<l[i]<<' '<<i<<' '<<idx<<endl;
return 0;
}
if(a[i]>maxx){
maxx=a[i];
idx=i;
}
}
int minn=a[1];
idx=1;
for(int i=2;i<n;i++)
{
if(minn<a[i]) w[i]=idx;
if(a[i]<minn){
minn=a[i];
idx=i;
}
}
minn=a[n];
idx=n;
for(int i=n-1;i>1;i--)
{
if(minn<a[i]&&w[i]){
cout<<3<<endl;
cout<<w[i]<<' '<<i<<' '<<idx<<endl;
return 0;
}
if(a[i]<minn){
minn=a[i];
idx=a[i];
}
}
cout<<0<<endl;
return 0;
}