题意
就是检查这个序列是否删除一个元素就能变成非严格的有序序列 表面上就是一个卡条件检查数组的问题
分析:
在向量中upperbound插入上界
这样能够使数组里的数列长度尽可能大
因为 我们是在不断用小数替换数列中的数
大的数直接拼接到最后
code
#include<bits/stdc++.h>
#define rep(i,a,b) for(int (i) = (a);(i)<=(b);(i)++)
#define rrep(i,a,b) for(int (i) = (a);(i)>=(b);(i)--)
using namespace std;
typedef long long ll;
int a[100005],b[100005];
int main()
{
int t;
scanf("%d",&t);
while(t--){
int n,S=1,NS=1;
scanf("%d",&n);
rep(i,1,n)scanf("%d",a+i);
vector<int>s;
s.clear();
s.push_back(a[1]);
rep(i,2,n){
if(a[i]>=s[s.size()-1])s.push_back(a[i]);
else{
int pos = upper_bound(s.begin(),s.end(),a[i])-s.begin();
s[pos]=a[i];
}
}
S = (int)s.size();
s.clear();
s.push_back(a[n]);
rrep(i,n-1,1){
if(a[i]>=s[s.size()-1])s.push_back(a[i]);
else{
int pos = upper_bound(s.begin(),s.end(),a[i])-s.begin();
s[pos]=a[i];
}
}
NS =(int)s.size();
if(NS>=n-1||S>=n-1)puts("YES");
else puts("NO");
}
return 0;
}