HDU5532 Almost Sorted Array(LIS的nlogn算法)
http://acm.hdu.edu.cn/showproblem.php?pid=5532
题意:给你一个数列,消除一个数以后,是剩下的数列是排序的(递增或递减的)。
题解:直接正反两次LIS即可,如果>=n-1,证明是YES。注意要用到LIS的nlogn算法。
注意元素相等的情况(WA的一晚。。。),数组开小会TLE==。
#include<cstdio> #include<iostream> #include<cstring> using namespace std; int a[100005],b[100005],t[100005]; int find(int l,int r,int num) { int mid; while(l<=r) { mid=(l+r)/2; if(num>=t[mid]) l=mid+1; else r=mid-1; } return l; } main() { int N,n,i,len,len1,ans; scanf("%d",&N); while(N--) { scanf("%d",&n); for(i=0;i<n;i++) scanf("%d",&a[i]); len=0; t[0]=-1; for(i=0;i<n;i++) { if(a[i]>=t[len]) t[++len]=a[i]; else { ans=find(1,len,a[i]); t[ans]=a[i]; } } if(len>=n-1) { printf("YES\n"); continue; } memset(t,0,sizeof(t)); for(i=0;i<n;i++) b[i]=a[n-i-1]; len1=0; t[0]=-1; for(i=0;i<n;i++) { if(b[i]>=t[len1]) t[++len1]=b[i]; else { ans=find(1,len1,b[i]); t[ans]=b[i]; } } if(len1>=n-1) { printf("YES\n"); continue; } printf("NO\n"); } }