一遍线型跑过
遇到下降就判断 如果可以调换就加计数器 最后看计数器的数量
注意!!
要注意重复的数据 所以加上等号
注意开始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; }