hoj2085 wavio sequence
时间复杂度 o(n*lgn);
zLen(i),jLen(i)表示以a[i]为末尾元素的递增,递减序列的长度
#include <iostream>
#include <memory.h>
using namespace std;
#define length 10000
int zLen[length+5],jLen[length+5];
int q[length+5];
int min(int x,int y)
{
return(x<=y?x:y);
}
int find(int* a,int eid,int num)
{
int left=0;
int right=eid;
while(left<=right)
{
int mid=(left+right)/2;
if(num<a[mid]) right=mid-1;
else if(num>a[mid]) left=mid+1;
else return mid;
}
return left;
}
int main(int args,char** argv)
{
int A[length+5];
int n;
while(cin>>n)
{
for(int i=0;i<n;i++)
{cin>>A[i];
}
q[0]=-100000;
for(int i=1;i<n+4;i++)
q[i]=100000;
zLen[0]=1;
q[1]=A[0];
for(int i=0;i<n;i++)
{
int j=find(q,n+2,A[i]);
q[j]=A[i];
zLen[i]=j;
}
for(int i=1;i<=n+3;i++)
q[i]=100000;
q[0]=-100000;
jLen[n-1]=1;
q[1]=A[n-1];
for(int i=n-1;i>=0;i--)
{
int j=find(q,n+2,A[i]);
q[j]=A[i];
jLen[i]=j;
}
int ans=0;
for(int i=0;i<n;i++)
{
//cout<<i<<": "<<zLen[i]<<" "<<jLen[i]<<endl;
if(ans<2*min(zLen[i],jLen[i])-1) ans=2*min(zLen[i],jLen[i])-1;
}//for
cout<<ans<<endl;
}//while
return 0;
}

浙公网安备 33010602011771号