一遍线型跑过

遇到下降就判断 如果可以调换就加计数器 最后看计数器的数量

注意!!

要注意重复的数据 所以加上等号

注意开始l r 赋初值均为1

也就没有什么其他的需要注意了

普通的线型模拟 注意细节别写的脑袋昏

#include
#define debug cout<<bug<<endl
using namespace std;
const int inf=0x7f7f7f7f;
inline void read(int &x){
    x=0;int f=1;char c=getchar();
    while(c>'9'||c<'0'){if(c=='-') f=-1;c=getchar();}
    while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+(c^48),c=getchar();
    x*=f;
}
int n,x,y,l=1,r=1,f;
int a[100100];
int main()
{

    read(n);
    for(int i=1;i<=n;i++) read(a[i]);
    a[n+1]=inf;
    for(int i=1;i<=n;i++)
    {
        if(a[i]<a[i-1])
        {
            f++;
            l=i-1;
            x=a[i-2];
            for(;i<=n;i++)
            {
                if(a[i]<=a[i+1])
                {
                    if(x>=a[i]) f=inf;
                    if(a[l]>=a[i+1]) f=inf;
                    r=i;
                    break;
                }
            }
        }
    }
    if(f>1) printf("no\n");
    else printf("yes\n%d %d\n",l,r);
    return 0;
}