题意:
一个无重复数字的序列,能否反转一个区间使其成为单增序列。
解析:
记录每个点的值和初始下标,然后排序。
对于排好序的序列进行遍历,找出第一段和原序列下标不同的区间并且标记(此区间即为翻转的区间),如果还出现其他的不同区间则不符题意。
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e5+5;
int t,n,s;
struct node{
int id,k;
bool operator<(const node& t)const{
return k<t.k;
}
}a[N];
signed main(){
scanf("%lld",&n);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i].k);
a[i].id=i;
}
sort(a+1,a+n+1);
int l=-1,r,f=1;
for(int i=1;i<n;i++){
if(a[i].id!=i){
s=1;
if(l==-1){
l=i,r=i;
int p=a[i].id;
for(int j=i+1;j<=n;j++){
if(a[j].id==p-1) r++,p--;
else break;
}
i=r;
}
else{
f=0;
break;
}
}
}
if(!s) l=r=1;
if(f) cout<<"yes"<<endl<<l<<" "<<r;
else cout<<"no";
return 0;
}