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