题目链接:codeforces 451B.Sort the Array
题意:
给出n个数,将其某一段区间翻转之后,使数组元素递增,如果可以,输出那段区间,否则输出 no
题解:
①如果本身数组递增, 那么输出 1 1.
②如果有两个以上递减区间,那么输出 no
③ 如果递减的第一个元素大于递减区间的后一个元素,或递减区间的最后一个元素大于递减区间前的元素, 输出no
2, 5 ,3 , 1, 4, 6(这种情况不满足)
递减区间 5 ,3, 1 所以要保证 5小于4且 1 要大于 2 ,因为不满足,输出 no
5为递减区间的第一个元素,1为递减区间的最后一个元素
2为递减区间前的一个元素,4为递减区间后的一个元素
AC代码
#include <bits/stdc++.h>
using namespace std;
int a[1000005];
int main(){
int n, ans1 = 0, ans2 = 0, f = 0;
cin >> n;
for(int i = 1; i <= n; i++){
cin >> a[i];
}
a[0] = -1; a[n+1] = 1000000001; // 第一个设为负数,最后一个设很大
for(int i = 1; i <= n; i++){
if(a[i] > a[i+1] && ans1 == 0){ // 第一个递减区间
ans1 = i; // 第一个递减区间的首位置
while(a[i] > a[i+1]){
ans2 = i; // 递减区间的末位置
i++;
}
f++;
}
else if(a[i] > a[i+1]){ // 出现多个递减区间
f++;
}
}
if(f == 0){ // 数组元素本身单调递增
cout << "yes" << endl << "1 1" << endl;
}
else if(f > 1 || a[ans1] > a[ans2+2] || a[ans2+1] < a[ans1-1]){
cout << "no" << endl; // f>1多个递减区间 这里画图解释
}
else{
cout << "yes" << endl << ans1 << " " << ans2+1 << endl;
}
return 0;
}