【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;
}