zoukankan      html  css  js  c++  java
  • 【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;
    }
    
  • 相关阅读:
    指针2
    学习笔记day3
    学习笔记day2
    学习笔记day1
    lighttpd启用支持IPv6
    GPL/widedhcpv6/dhcp6c源代码分析
    有多个vsftpd进程运行
    Java学习笔记day1
    python_day4
    python_day3.2
  • 原文地址:https://www.cnblogs.com/GJY-JURUO/p/13503530.html
Copyright © 2011-2022 走看看