We are all familiar with sorting algorithms: quick sort, merge sort, heap sort, insertion sort, selection sort, bubble sort, etc. But sometimes it is an overkill to use these algorithms for an almost sorted array. Input The first line contains an integer T indicating the total number of test cases. Each test case starts with an integer n in one line, then one line with n integers a1,a2,…,an . Output For each test case, please output "`YES`" if it is almost sorted. Otherwise, output "`NO`" (both without quotes). Sample Input 3 3 2 1 7 3 3 2 1 5 3 1 4 1 5 Sample Output YES YES NO |
http://acm.hdu.edu.cn/showproblem.php?pid=5532
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int a[100010];
int main(){
int t;
scanf("%d",&t);
while(t--){
int n;
scanf("%d",&n);
int f1=0;
int f2=0;
int s=0,d=0;//升,降 gg
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
if(i!=1){
if(a[i]<a[i-1]){
f1++;
s=i;
}
if(a[i]>a[i-1]){
f2++;
d=i;
}
}
}
int k1=0,k2=0;
if(f1>1 && f2>1){
printf("NO\n");
continue;
}
if(f1==0 || f2==0){
printf("YES\n");
continue;
}
if(f1==1){
a[n+1]=9999999;
a[0]=0;
if(a[s]>=a[s-2] || a[s-1]<=a[s+1]){
k1=1;
}
}
if(f2==1){
a[n+1]=0;
a[0]=9999999;
if(a[d]<=a[d-2] || a[d-1]>=a[d+1]){
k2=1;
}
}
if(k1==1 || k2==1){
printf("YES\n");
}
else{
printf("NO\n");
}
}
}