题意:
一个无重复数字的序列,能否反转一个区间使其成为单增序列。
解析:
记录每个点的值和初始下标,然后排序。
对于排好序的序列进行遍历,找出第一段和原序列下标不同的区间并且标记(此区间即为翻转的区间),如果还出现其他的不同区间则不符题意。
#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;
}