题目链接:Almost Sorted Array
题目大意:给你一个序列,问你能不能刚好去掉一个数使得整个序列不上升或者不下降
题目思路:我们找到这个序列的最长不上升和最长不下降,然后看这个长度是不是>=len-1就好了
#include <map>
#include <stack>
#include <queue>
#include <cmath>
#include <vector>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn = 1e5+10;
int T,n,a[maxn],b[maxn],ans[maxn],len;
int main(){
scanf("%d",&T);
while(T--){
memset(ans,0,sizeof(ans));
scanf("%d",&n);
for(int i = 1;i <= n;i++)
scanf("%d",&a[i]);
ans[1] = a[1];
len = 1;
for(int i = 2;i <= n;i++){
if(a[i] >= ans[len]) ans[++len] = a[i];
else{
int pos = upper_bound(ans+1,ans+len+1,a[i])-ans;
ans[pos] = a[i];
}
}
if(len == n-1||len == n){puts("YES");continue;}
for(int i = 1;i <= n;i++)
b[i] = a[n-i+1];
ans[1] = b[1];
len = 1;
for(int i = 2;i <= n;i++){
if(b[i] >= ans[len]) ans[++len] = b[i];
else{
int pos = upper_bound(ans+1,ans+len+1,b[i])-ans;
ans[pos] = b[i];
}
}
if(len == n-1||len == n){puts("YES");continue;}
puts("NO");
}
return 0;
}