UVA - 10534 Wavio Sequence

来源:互联网 发布:博物馆软件 编辑:程序博客网 时间:2024/06/11 19:44

n*logn 的最长上升子序列的实现

二分查找,维护一个升序数组来实现最长上升子序列。

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <cmath>using namespace std;const int maxn=10005;int arr[maxn],f1[maxn],f2[maxn],OrdArr[maxn];int Binary_S(int t,int key){int l=1,r=t,mid=(l+r)>>1;while(l<r){if(OrdArr[mid]<key)l=mid+1;else r=mid;mid=(l+r)>>1;}return l;}int main(){int n;while(scanf("%d",&n)==1){for(int i=1;i<=n;i++)scanf("%d",arr+i);memset(f1,0,sizeof(f1));memset(f2,0,sizeof(f2));int len=1;OrdArr[1]=arr[1];f1[1]=1;for(int i=2;i<=n;i++){if(arr[i]>OrdArr[len]){++len;OrdArr[len]=arr[i];f1[i]=len;}else {int tmp=Binary_S(len,arr[i]);f1[i]=tmp;OrdArr[tmp]=arr[i];}}len=1;OrdArr[1]=arr[n];f2[n]=1;for(int i=n-1;i>0;i--){if(arr[i]>OrdArr[len]){++len;OrdArr[len]=arr[i];f2[i]=len;}else {int tmp=Binary_S(len,arr[i]);f2[i]=tmp;OrdArr[tmp]=arr[i];}}int ans=0;for(int i=1;i<=n;i++){     int tmp=min(f1[i],f2[i]);if(tmp>ans)ans=tmp;}printf("%d\n",2*ans-1);}return 0;}


0 0