单调递增子序列(二)
时间限制:
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
//二分+dp
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
int dp[100000+10];
int a[100000+10];
int binary_search(int key,int right)
{
int left=1;
int mid;
while(left<=right)
{
mid=(left+right)>>1;
if(dp[mid]>=key) //注意'='号的位置
right=mid-1;
else
left=mid+1;
}
return left;
}
int main()
{
int n;
while(cin>>n)
{
for(int i=1; i<=n; i++)
cin>>a[i];
dp[1]=a[1];
int len=1;
for(int i=2; i<=n; i++)
{
int t=binary_search(a[i],len);
dp[t]=a[i];
len=max(len,t);
}
printf("%d\n",len);
}
return 0;
}//ac