Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)
Total Submission(s): 1339 Accepted Submission(s):
398
#include<stdio.h> #include<string.h> #include<algorithm> #include<stdlib.h> #include<math.h> #define MAX 100100 #define INF 0x3f3f3f #define DD double using namespace std; int stack[MAX]; int top; int f(int x)//二分 查找栈中第一个大于x的数 { int l=0,r=top; int mid; while(r>=l) { mid=(l+r)/2; if(x>=stack[mid]) l=mid+1; else r=mid-1; } return l; } int main() { int t,n,m,j,i,k; scanf("%d",&t); while(t--) { scanf("%d",&n); int s[MAX]; for(i=1;i<=n;i++) scanf("%d",&s[i]); top=0; stack[0]=-1; for(i=1;i<=n;i++) { if(s[i]>=stack[top]) stack[++top]=s[i]; else stack[f(s[i])]=s[i]; } int ans=top; memset(stack,0,sizeof(0)); top=0; stack[0]=-1; for(i=n;i>=1;i--) { if(s[i]>=stack[top]) stack[++top]=s[i]; else stack[f(s[i])]=s[i]; } int ant=top; if(n-ant<=1||n-ans<=1) printf("YES\n"); else printf("NO\n"); } return 0; }
原文:http://www.cnblogs.com/tonghao/p/5036447.html