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;
}

 

posted @ 2012-02-05 19:43  wuzhibin  阅读(227)  评论(0)    收藏  举报