【SSL 1480】双端队列xLIS问题

题目大意:

给定 (N) 个数,将它们依次插入一双端队列,将整个队列从尾到头看做一序列,问最大的最长上升子序列。

正文:

本题思路及其巧妙,因为队列是双端的,可以在输入的序列之前倒着排一遍(如输入的序列是(A={1,2,4,3}),操作后为 (A={3,4,2,1,1,2,4,3}),),又因为是最长上升子序列并不是不下降子序列,所以不可能重复算,操作后直接用 (O(nlog n)) 的方法求最长上升子序列即可。

代码:

int main()
{
	scanf ("%d", &n);
	for (int i = 1; i <= n; i++)
		scanf ("%d", &a[n - i + 1]), a[n + i] = a[n - i + 1];
	for (int i = 1; i <= n * 2; i++)
	{
		if(f[top] < a[i])
		{
			f[++top] = a[i];
			continue;
		}
		int k = lower_bound(f + 1, f + 1 + top, a[i]) - f;
		f[k] = a[i];
	}
	printf("%d", top);
	return 0;
}
原文地址:https://www.cnblogs.com/GJY-JURUO/p/13503530.html