nyoj 214 单调递增子序列(二)
单调递增子序列(二)
时间限制:1000 ms | 内存限制:65535 KB
难度:4
描述
给定一整型数列{a1,a2...,an}(0<n<=100000),找出单调递增最长子序列,并求出其长度。
如:1 9 10 5 11 2 13的最长单调递增子序列是1 9 10 11 13,长度为5。
输入
有多组测试数据(<=7)
每组测试数据的第一行是一个整数n表示序列中共有n个整数,随后的下一行里有n个整数,表示数列中的所有元素.每个整形数中间用空格间隔开(0<n<=100000)。
数据以EOF结束 。
输入数据保证合法(全为int型整数)!
输出
对于每组测试数据输出整形数列的最长递增子序列的长度,每个输出占一行。
样例输入
7
1 9 10 5 11 2 13
2
2 -1
样例输出
5
1
#include<stdio.h> #include<string.h> #define N 100010 int a[N],dp[N]; int binarysearch(int k,int len) { int right=len; int left=1; int mid=(right+left)>>1; while(left<=right) { if(k==dp[mid]) return mid; if(k>dp[mid]) left=mid+1; else right=mid-1; mid=(right+left)>>1; } return left; } int main() { int n; while(scanf("%d",&n)!=EOF) { int len,t; for(int i=0;i<n;i++) scanf("%d",&a[i]); len=1; dp[1]=a[0]; for(int i=1;i<n;i++) { t=binarysearch(a[i],len); dp[t]=a[i]; if(t>len) len=t; } printf("%d\n",len); } return 0; }