题目链接

1.题目描述:给定一个长度为n的序列,现在可以删除一段任意长度的子序列,使得删除后剩下的序列中有长度最大的连续递增子序列

2.这个题目很新颖,刚开始看裸写了一个LIS,一看样例过了兴致勃勃的交了上去,结果WA了。仔细一看,这里只能删一段序列,并不是任意跳跃式的选择,而且最后的答案是最长的连续递增子序列。如果单纯地求连续递增子序列还好说,现在可有点麻烦

3.顺着刘老师的思路看下去,预处理以i下标开头的最长连续递增子序列长度,以j结尾的最长连续递增子序列长度,那么就是枚举i,快速找一个j<i使得a[j] < a[i]而且g(j)+f(i)尽量大。下面讲了使用set的思路,看了看,好长好麻烦,又要插入删除和二分查找,真的不想写。又看到下一页最下面写着:可以用LIS的nlog(n)算法避开set,也就是第二种方法

4.去网上看了看,果不其然,我是看这篇博客学习的。首先整体思路不变,仍然是使用f(i)记录以i结尾的的最长递增子序列的长度,g(i)记录以i开头的最长递增子序列的长度,和普通的LIS类似,利用一个数组d[i]记录长度为 i 的连续递增序列的最后一个元素的最小值,显然该序列是单调递增的,所以可以通过二分查找直接得到f[j]的值,进而得到一个可行的长度ans, 然后更新数组d即可,更新的方法是如果以a[i]小于数组d中记录的与a[i]长度相同的序列的最后一个元素的值,那么把这个值改为a[i], 即 d[f[i]] = min(a[i], d[f[i]]); 最终ans的最大值即为答案

5.其他的都懂,就是为什么d[i]会保证单调性这里真的头看破都想不通,属实无奈便模拟了第一个样例:
9
5 3 4 9 2 8 6 7 1

6.最后简单证明一下为什么d数组是单调的(初始化均为INF):
设p,q为两个连续的长度,他们对应数组下标分别为i,j,很明显q=p+1且肯定有a[i]<a[j]。假设当前正在判断p、q,如果之前长度p的d[p]没有被更新,那么显而易见;如果之前有p` =p:
①若之前有d[p`]<a[i],那么d[p`]不更新,一定有d[p`]<a[j]
②若之前有d[p`]>a[i],那么d[p`]更新为a[i],后面一定有d[q]由INF更新为a[j],那么d[p]<a[j]=d[q]
证毕

#include <iostream>
#include <set>
#include <algorithm>
#include <cstring>
using namespace std;
#define INF 0x7fffffff
const int maxn=2e5+10;int a[maxn],f[maxn],g[maxn],d[maxn];int main(){int t,n;scanf("%d",&t);while(t--){scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",&a[i]);for(int i=1;i<=n;i++){if(a[i]>a[i-1])f[i]=f[i-1]+1;else f[i]=1;}g[n]=1;for(int i=n-1;i>=1;i--){if(a[i]<a[i+1])g[i]=g[i+1]+1;else g[i]=1;}for(int i=0;i<=n;i++) d[i]=INF;int ans=0;for(int i=1;i<=n;i++){int len=(lower_bound(d+1,d+1+i,a[i])-(d+1))+g[i];ans=max(ans,len);d[f[i]]=min(a[i],d[f[i]]);}printf("%d\n",ans);}return 0;
}

UVa1471 Defense Lines(LIS变形)相关推荐

  1. UVA 1471 Defense Lines (LIS变形)

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

  2. uva1471 Defense Lines

    题意:给一个长度为n(n<=200000)的序列,删掉某一个连续的序列,使得剩下的序列有一个长度最大的连续递增子序列. 思路:首先这里最容易想到,枚举任意两个点j,i,删掉从j到i的序列,求剩下 ...

  3. [数据结构] UVa1471 Defense Lines 防线

    题目 思路 1.需明确,在删除之后,最长连续递增子序列一定会存在在删除后两端连接处.下文用L代表最长连续递增子序列. 算法1:枚举起点j,终点i,再计算两点之间的L.O(n3)O(n3)O(n^3) ...

  4. uva 1471 Defense Lines

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

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

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

  6. UVA 1471 Defense Lines 防线

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

  7. hdu 5256 LIS变形

    给一个数列,问最少修改多少个元素使数列严格递增.如果不是要求"严格"递增,那就是求最长不降子序列LIS,然后n-LIS就是答案.要严格递增也好办,输入的时候用每个数减去其下标处理一 ...

  8. hdu 5087(LIS变形)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5087 解题思路:这道题其实仔细想想很简单,次长LIS只有两种可能,一种就是等于LIS-1,一种就是LI ...

  9. 1715: 序列变换(LIS变形)

    1715: 序列变换 时间限制: 1 Sec 内存限制: 128 MB [提交][状态][讨论版] 题目描述 我们有一个数列A1,A2-An,你现在要求修改数量最少的元素,使得这个数列严格递增.其中无 ...

最新文章

  1. 【C++ 语言】面向对象 ( 模板编程 | 函数模板 | 类模板 )
  2. 电脑主机,晚上就煎肉,把隔壁宿舍都馋哭了!
  3. SQLServer之PRIMARY KEY约束
  4. MySQL 下载与安装
  5. 一份完整的问卷模板_一份完整市场推广策划方案模板
  6. 2018.10.27 bzoj3209: 花神的数论题(数位dp)
  7. 2011年6月CISA考试报名时间公布
  8. sql 获取当前日期的季度,年份,月份等日期部分
  9. selenium chrome历史版本docker镜像分享
  10. 终端conda install安装包 import 错误_Tecplot 360 2017软件安装包+安装教程
  11. 计算机本科生毕业设计题目(三)
  12. 软件质量模型详解————思维导图
  13. ubuntu在终端会话和图形界面之间切换的快捷键
  14. HUAWEI Mate40Pro解除账号忘记密码ID强制刷机鸿蒙系统激活锁能解开吗
  15. 莫列波纹(Moiré pattern)与Banding
  16. Java+spring 基于ssm的幼儿园管理系统程序#毕业设计
  17. SecureCRT调整字体大小
  18. 使用photoswipe展示图片
  19. VS.NET 2005
  20. android killer回编译apk后,提示无法安装的解决办法

热门文章

  1. 《大话西游》经典对白
  2. html怎么实现蓝色垂直的直线,css实例教程 一款纯css实现的垂直时间线效果
  3. ip2977_desc.TXT
  4. 【NETGEAR网件】WNDR3700V4 或 WNDR4300 刷OpenWrt及恢复(刷回)
  5. alm服务java_ALM TFS/VSTS工具 的Java集成
  6. GeneXus项目启动
  7. 艺术 NFT 的发展之路
  8. 【Kotiln】 错误锦集- Caused by: kotlin.NotImplementedError: An operation is not implemented: not implemen
  9. 请做好 5 年内随时失业的准备
  10. BEA提出SOA四大策略