题意
就是检查这个序列是否删除一个元素就能变成非严格的有序序列 表面上就是一个卡条件检查数组的问题
分析:
在向量中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;
}