连接:http://acm.nyist.net/JudgeOnline/problem.php?pid=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> const int M=100010; int mask[M/2]; int date,max; void gg(int l,int r) { if(r==l) { mask[r]=date; return; } int mid=(l+r)>>1; if(date > mask[mid])gg(mid+1,r); else gg(l,mid); } int main() { // freopen("in.txt","r",stdin); int n,i,j; while(~scanf("%d",&n)) { max=1; scanf("%d",&date); mask[1]=date; for(i=2;i<=n;i++) { scanf("%d",&date); if(date>mask[max]) { max++; mask[max]=date; continue; } gg(1,max); } printf("%d\n",max); } return 0; }