题目

给定一个长度为 N 的数列,求数值严格单调递增的子序列的长度最长是多少。

输入格式

第一行包含整数 N。

第二行包含 N 个整数,表示完整序列。

输出格式

输出一个整数,表示最大长度。

数据范围

1≤N≤100000,
−109≤数列中的数≤109

输入样例:

7
3 1 2 1 8 5 6

输出样例:

4

思路

代码

#include<iostream>

using namespace std;

const int N = 1e5 + 10;
int a[N], q[N];// a[i]存序列   q[i]存第i长度下的最高位 

int main()
{
	int n;
	cin >> n;
	for(int i = 0; i < n; i ++)cin >> a[i];
	
	int len = 0;
	q[0] = -2e9;//哨兵 保证一定能找到q[1]后面的数 
	for(int i = 0; i < n; i ++)
	{
		int l = 0, r = len;
		while(l < r)
		{
			int mid = l + r + 1 >> 1;
			if(q[mid] < a[i])l = mid;
			else r = mid - 1;
		}
		len = max(len, r + 1);
		q[r + 1] = a[i];
	} 
	
	cout << len;
	
	return 0;
}

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐