[UVa1471] Defense Lines

算法入门经典第8章8-8 (P242)

题目大意:将一个序列删去一个连续子序列,问最长的严格上升子序列 (N<=200000)

试题分析:算法1:直接暴力,对于一个删除序列,枚举头和尾,然后看最长上升子序列。时间复杂度:O(N^3)

     算法2:L[i]表示以i为结尾的最长严格上升子序列长度,R[i]表示以i为开头的最长严格上升子序列长度。 预处理:O(N)

          然后依旧是枚举头和尾,那么答案就是L[i]+R[j]了。时间复杂度:O(N^2)

     算法3:第一个与第二个时间复杂度对于题目来说都非常之高,所以O(NlogN)是我们需要的。

          预处理是必须要的,这样能除以O(N)。

          下面要改进的就是这个枚举i,j的循环了,能不能确定j(i),来唯一确定最优的i(j)呢?

          到这里,性质就比较显然了,我们需要用一个数据结构来维护它。

          那么具体用什么呢?这就是单调队列的典型问题了。

          可以发现,如果a[i']>=a[i] , 且L(i')>=L(i),那么要i是没有用的,因为i'更优或者余地更大了。

          然后维护这样一个数组,每次二分仅次于A[i]的值相加就好了。

          可能有些抽象,具体请看代码。

代码:

#include<iostream>
#include<cstring>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std; #define LL long long inline int read(){
int x=0,f=1;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
for(;isdigit(c);c=getchar()) x=x*10+c-'0';
return x*f;
}
const int INF=2147483640;//注意a[i]<=1e9,要开大一点
const int MAXN=2000001;
int L[MAXN+1],R[MAXN+1];
int N; int T;
int a[MAXN+1]; int Que[MAXN+1];
int FLen; int ans; int main(){
T=read();
while(T--){
N=read();
for(int i=1;i<=N;i++) a[i]=read();
L[1]=1,R[N]=1;//预处理
for(int i=2;i<=N;i++){
L[i]=1;
if(a[i]>a[i-1]) L[i]+=L[i-1];
}
for(int i=N-1;i>=1;i--){
R[i]=1;
if(a[i]<a[i+1]) R[i]+=R[i+1];
}
ans=0;
for(int i=1;i<=N;i++) Que[i]=INF;
for(int i=1;i<=N;i++){
FLen=lower_bound(Que+1,Que+1+N,a[i])-Que;//二分第一个大于等于于a[i]的值
ans=max(ans,FLen+R[i]-1);//计算长度,由于lower_bound是大于等于,所以要-1,让其变成第一个<a[i]
Que[L[i]]=min(Que[L[i]],a[i]);//相同的最后如果越小,后面的潜力越大
}
printf("%d\n",ans);
}
return 0;
}

  

【二分】Defense Lines的更多相关文章

  1. UVA - 1471 Defense Lines 树状数组/二分

                                  Defense Lines After the last war devastated your country, you - as the ...

  2. UVa 1471 Defense Lines (二分+set优化)

    题意:给定一个序列,然后让你删除一段连续的序列,使得剩下的序列中连续递增子序列最长. 析:如果暴力枚举那么时间复杂度肯定受不了,我们可以先进行预处理,f[i] 表示以 i 结尾的连续最长序列,g[i] ...

  3. 1471 - Defense Lines

    After the last war devastated your country, you - as the king of the land of Ardenia - decided it wa ...

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

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

  5. UVA - 1471 Defense Lines (set/bit/lis)

    紫薯例题+1. 题意:给你一个长度为n(n<=200000)的序列a[n],求删除一个连续子序列后的可能的最长连续上升子序列的长度. 首先对序列进行分段,每一段连续的子序列的元素递增,设L[i] ...

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

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

  7. Uva 1471 Defense Lines(LIS变形)

    题意: 给你一个数组,让你删除一个连续的子序列,使得剩下的序列中有最长上升子序列, 求出这个长度. 题解: 预处理:先求一个last[i],以a[i]为开始的合法最长上升子序列的长度.再求一个pre[ ...

  8. 【uva 1471】Defense Lines(算法效率--使用数据结构+部分枚举+类贪心)

    P.S.我完全一个字一个字敲出来的血泪史啊~~所以,没有附代码,也是可以理解的啦.OvO 题意:给一个长度为N(N≤200000)的序列,要删除一个连续子序列,使得剩下的序列中有一个长度最大的连续递增 ...

  9. UVa 1471 (LIS变形) Defense Lines

    题意: 给出一个序列,删掉它的一个连续子序列(该子序列可以为空),使得剩下的序列有最长的连续严格递增子序列. 分析: 这个可以看作lrj的<训练指南>P62中讲到的LIS的O(nlogn) ...

随机推荐

  1. Windows Server 2008 R2英文版修改桌面主题(Win7主题)

    1:首先打开Server Manager(凡是不知道在那里开发均可像Win7一样在运行里面搜索) 2:然后在左边的树形菜单中选择:Feature 点击右边页面中的:Add Features 这时候会出 ...

  2. chrome表单自动填充导致input文本框背景变成偏黄色问题

    你曾遇到过吗? 困扰宝宝好久的问题,本以为是什么插件导致的,结果是chrome浏览器自动填充文本时默认的样式,搜嘎. 一.修改自动填充input文本框背景色: 使用以下代码 可以设置自己的想要的默认文 ...

  3. hdu 1253 胜利大逃亡(简单题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1253 题目大意:在所给的时间能顺利离开城堡. #include <iostream> #i ...

  4. web服务器和数据库服务器不在一台机器上

    把localhost改成数据库所在的IP就行了. $link=mysql_connect( "202.195.246.202 ", "root ", " ...

  5. 【bzoj4033】HAOI2015树上染色

    树形dp. #include<bits/stdc++.h> #define N 2010 using namespace std; typedef long long ll; ,head[ ...

  6. C高级 跨平台协程库

    1.0 协程库引言 协程对于上层语言还是比较常见的. 例如C# 中 yield retrun, lua 中 coroutine.yield 等来构建同步并发的程序. 本文就是探讨如何从底层实现开发级别 ...

  7. Mysql 数据库学习笔记03 存储过程

    一.存储过程:如下           通过 out .inout 将结果输出,可以输出多个值. * 调用存储过程: call 存储名称(参数1,参数2,...); 如指定参数不符合要求,返回 Emp ...

  8. JAVA中静态块、静态变量加载顺序详解

    http://blog.csdn.net/mrzhoug/article/details/51581994 一般顺序:静态块(静态变量)——>成员变量——>构造方法——>静态方法

  9. css - 字体图标的制作

    很多的时候我们在开发过程中一般都是直接使用图片,尤其在移动页面频繁请求图片对性能不是很好 ,所以图标字体的应用也越来越广泛.一般情况下直接用的是font awesome字体,但是有时候需要制作自己风格 ...

  10. Eclipse的工程名有红色的感叹号,工程里面没有显示编译错误

    在导入其他人或配套光盘中的工程时,经常会出现这种错误. 问题的原因: 通常是JRE的版本不同造成的. 解决的办法: 是选择工程名,然后通过在右键菜单中选择build path->configue ...