题意:给出长度为N的序列,现在让你删除一个连续的、任意长度的序列,从而形成一个最长的上升子序列。

思路:第一遍看错题了,以为是标准的最长上升子序列,然后就错了。

再看一遍题意,其实只是让你删除一个连续的、任意长度的序列,注意只有一次机会。

这样,我们就能发现,其实最终的最长上升子序列是由两段拼成的,这两段分别是连续的。

首先第一个技巧,就是分别求出以位置i开始和结束的最长上升子序列f(i),g(i)。这个可以O(N)得到。

但是我们要是直接暴力枚举i,j, i < j 的话,复杂度为O(N^2),会超时。这样,我们就枚举i,同时去找最优的j,使f(i) + g(j)最大。

我们可以发现,同标准的最长上升子序列一样,对于f(i) = f(j),且A[i] < A[j],位置i比位置j更有可能成为最优解。这就是说,对于相同的长度,数字的值更小,更能继续延长该序列。这样,我们就能像标准的最长上升子序列一样,用单调队列进行优化。对于每个f(i),保存最小的A[i]。因为是单调的,我们就能二分找目标值。

所以整体的复杂度为:O(nlogn)

代码如下:

#include <cstdio>
#include <algorithm>
#include <set>
#include <cstring>using namespace std;const int MAX = 200010;int N,T,a[MAX],f[MAX],g[MAX],b[MAX];int main(void)
{//freopen("input.txt","r",stdin);scanf("%d",&T);while(T--){scanf("%d",&N);for(int i = 0; i < N; ++i)scanf("%d",a+i);for(int i = 0; i < N; ++i)if(i && a[i] > a[i-1])f[i] = f[i-1] + 1;elsef[i] = 1;for(int i = N - 1; i >= 0; --i)if(i + 1 < N && a[i] < a[i+1])g[i] = g[i+1] + 1;elseg[i] = 1;int ans = 0;memset(b,0x3f,sizeof(b));b[0] = 0;for(int i = 0; i < N; ++i){ans = max(ans,g[i] + (int)(lower_bound(b,b+N+1,a[i]) - b - 1));b[f[i]] = min(b[f[i]],a[i]);}printf("%d\n",ans);}return 0;
}

UVA 1471 Defense Lines 单调队列优化相关推荐

  1. uva 1471 Defense Lines

    题目大意:给定一串数字序列,然后叫你删除连续一部分序列,然后使得剩下的序列中存在的连续的最大增长序列长度是多少 . . // // main.cpp // uva UVa1471 Defense Li ...

  2. UVa 1471 Defense Lines - 线段树 - 离散化

    题意是说给一个序列,删掉其中一段连续的子序列(貌似可以为空),使得新的序列中最长的连续递增子序列最长. 网上似乎最多的做法是二分查找优化,然而不会,只会值域线段树和离散化... 先预处理出所有的点所能 ...

  3. UVA 1471 Defense Lines (LIS变形)

    题意:删除原序列中的一段连续子序列,使得剩下的序列中存在一段最长连续子序列. 题解:LIS变形 我们用l[i]l[i]l[i]和r[i]r[i]r[i]记录往右以iii结尾和往左以iii开头的最长连续 ...

  4. UVA 1471 Defense Lines 防线

    https://vjudge.net/problem/UVA-1471 给一个长度为n的序列,要求删除一个连续子序列,使剩下的序列有一个长度最大的连续递增子序列. 例如  Sample Input 2 ...

  5. uva 1471 Defense Lines (降低复杂度)

    题意: 给一个长度为n(n <= 200000) 的序列,你删除一段连续的子序列,使得剩下的序列拼接起来,有一个最长的连续递增子序列 思路: 设f[i] 和g[i] 分别表示 以i为开始 和 以 ...

  6. UVa 1471 Defense Lines (解释紫书思路)

    题目链接:https://cn.vjudge.net/problem/UVA-1471 设序列L表示连续递增子序列: 则最长的L就可以分为两部分,一部分是以j结尾的序列,另一部分是以i为开头的序列 现 ...

  7. UVA 1471 Defense Lines 防线 (LIS变形)

    给一个长度为n的序列,要求删除一个连续子序列,使剩下的序列有一个长度最大的连续递增子序列. 最简单的想法是枚举起点j和终点i,然后数一数,分别向前或向后能延伸的最长长度,记为g(i)和f(i).可以先 ...

  8. uva 1471 Defense Lines

    题目:https://vjudge.net/problem/UVA-1471 题意:  lrj思路:第一思路可以暴力枚举,先枚举i(i=1:len),i往右数,看以i开头的最大升序序列个数.然后再枚举 ...

  9. UVA - 1471 Defense Lines 贪心+二分

    题目大意:给出长度为n的序列,要求你删除掉一段的连续子序列,使得剩下的序列的递增子序列最长 解题思路:记录以下每个位置的值所能延伸的最左端和最右端,用一个数组记录长度为i的数的最小值,然后从左往右扫描 ...

最新文章

  1. 独家 | ARIMA/Sarima与LSTM的时间序列数据集成学习(附链接)
  2. float布局设置同一行行高一样_布局思想:大事化小、先行后列、见缝插针
  3. c语言87,C语言程序设计87300.doc
  4. 在iis中注册.net framework
  5. boost::mpi模块实现测试mpi版本
  6. React 之 高阶组件的理解
  7. 如何在Marketing Cloud launchpad里添加Contact创建tile
  8. Linux 中的包管理器是什么?它是如何工作的?
  9. 目标检测(十一)--ConvNets目标检测概述
  10. SuperMap BIM+GIS技术白皮书
  11. 一打卡作弊软件CEO被判5年6个月,网友:这也太...
  12. 计算机word表格ppt,计算机应用基础-04-WORD表格.ppt
  13. 网上赚钱最快的方法 干什么能挣钱快
  14. 动态RAM和静态RAM的区别(浅学)
  15. 高质量蓝牙耳机推荐,2023年热销火爆的蓝牙耳机推荐
  16. 黑猫带你学eMMC协议第25篇:eMMC命令队列详解(CMDQ)
  17. 【Python】窗口界面 按钮 文本框
  18. vant2-上拉加载、下拉刷新
  19. Ruby on Rails - 使用puma部署Rails项目
  20. new Set( ) 数组去重 适用场景

热门文章

  1. 3D游戏建模:胜似美杜莎的超细节刻画—《大海的精灵》| 模型欣赏
  2. 硬盘健康状态、温度、通电次数、写入量和序列号检查软件
  3. 乐优商城之分类查询品牌查询(八)
  4. 塔科玛校区的计算机教育,华盛顿大学塔科马校区申请难度
  5. java中 SSL认证和keystore使用
  6. “跳槽”一词的来历竟然是这样!汗
  7. javascript检查移动设备是否支持重力方向感应
  8. android 程序根据重力感应切换程序的方向
  9. 敏捷开发与GeneXus哲学
  10. 单片机通信——spi、iic、uart