1 #include <iostream> 2 #include <string.h> 3 #include <string> 4 #include <fstream> 5 #include <algorithm> 6 #include <stdio.h> 7 #include <vector> 8 #include <queue> 9 #include <set> 10 #include <cmath> 11 using namespace std; 12 const double eps = 1e-8; 13 const int INF=0x7fffffff; 14 #define MAXN 10002 15 16 int main() 17 { 18 int a[MAXN]; 19 int n; 20 int g[MAXN]; 21 int up[MAXN],down[MAXN]; 22 while(scanf("%d",&n)!=EOF) 23 { 24 for(int i=0;i<n;i++) 25 scanf("%d",&a[i]); 26 int ans=-1; 27 for(int i=0;i<=n;i++)g[i]=INF; 28 for(int i=0;i<n;i++) 29 { 30 int k=lower_bound(g+1,g+n+1,a[i])-g; 31 up[i]=k; 32 g[k]=a[i]; 33 } 34 35 for(int i=0;i<=n;i++)g[i]=INF; 36 for(int i=n-1;i>=0;i--) 37 { 38 int k=lower_bound(g+1,g+n+1,a[i])-g; 39 down[i]=k; 40 g[k]=a[i]; 41 } 42 43 for(int i=0;i<n;i++) 44 { 45 ans=max(ans,min(up[i],down[i])*2-1); 46 } 47 printf("%d ",ans); 48 } 49 return 0; 50 }
刘汝佳的 O(nlogn) 的 LIS 算法
lower_bound(first,last,value)在first和last中的前闭后开区间进行二分查找,返回大于或等于value的第一个元素位置。如果所有元素都小于val,则返回last的位置。