【SSL 1480】双端队列xLIS问题

题目大意:

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

正文:

本题思路及其巧妙,因为队列是双端的,可以在输入的序列之前倒着排一遍(如输入的序列是\(A={1,2,4,3}\),操作后为 \(A={3,4,2,1,1,2,4,3}\),),又因为是最长上升子序列并不是不下降子序列,所以不可能重复算,操作后直接用 \(O(n\log 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;
}
posted @ 2020-08-14 17:43  Jayun  阅读(144)  评论(0编辑  收藏  举报