F--Almost Sorted Array(2015-ACM-ICPC长春站)
题目大意:去掉一个数能不能构成不递增子序列或不递减序列
解体思路:就是正反两遍LIS(最长不递减子序列),如果len>=n-1的话就是,不然就不是
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; const int N=100005; int a[N],f[N]; int bsearch(const int *f,int size,const int &a) { int l=0,r=size-1; while(l<=r) { int mid=(l+r)/2; if(a>=f[mid-1]&&a<f[mid]) return mid; else if(a<f[mid]) r=mid-1; else l=mid+1; } } int LIS(const int *a,const int &n) { int i,j,size=1; f[0]=a[0]; for(i=1;i<n;i++) { if(a[i]<f[0]) j=0; else if(a[i]>=f[size-1]) j=size++; else j=bsearch(f,size,a[i]); f[j]=a[i]; } return size; } int main() { int i,n; int T; scanf("%d",&T); while(T--) { scanf("%d",&n); for(i=0;i<n;i++) scanf("%d",&a[i]); int cnt1=LIS(a,n); reverse(a,a+n); int cnt2=LIS(a,n); if(cnt1>=n-1) { printf("YES\n"); continue; } if(cnt2>=n-1) { printf("YES\n"); continue; } printf("NO\n"); } return 0; }