HDU 5489 Removed Interval (LIS,变形)
题意:
给出一个n个元素的序列,要求从中删除任一段长度为L的连续子序列,问删除后的LIS是多少?(n<=10w, L<=n ,元素可能为负)
思路:
如果会O(nlogn)求普通LIS的算法,这道题将变得很简单。
首先按照求LIS的思路,当扫到元素a[i]并完成操作后,a[1->i]就是一段已经处理完成的序列,假设a[i+1]->a[i+L]这一段是将要删去的,那么将分成两段:a[0]->a[i]和a[i+L+1]->a[n]。
假设后一段以a[i+L+1]开头,而前段以一个小于a[i+L+1]的元素结尾,那么LIS应该为bac[前段]+len[后段]。
如何求bac[前段]?根据O(nlogn)求普通LIS的算法,当扫到a[i]且处理完的时候,就可以在当前d[]数组中找到a[i+L+1]应处的位置,用bac[i+L+1]标记起来其位置,知位置也就知其长度了。
如何求后段?当前段的bac[]数组全部求完时,按照O(nlogn)求普通LIS的算法,逆向再求一次此序列的LIS,当扫到a[j]时,求一下以a[j]开头的len[j]就行了。
其实就是枚举一个位置pos=i,然后删除其前面一段长度为L的子序列,分别求前段以a[i]结尾,求后段以a[i]开头的LIS。但是这样为什么是正确的?假设枚举到seq[i],后段中出现有LIS更长的,但是不是以seq[i]开头的怎么办?那么LIS更长的开头必定是一个seq[j]<seq[i],而你是从后面往前枚举的,以seq[j]开头的早就被你考虑过了。
//#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <map>
#include <algorithm>
#include <vector>
#include <iostream>
#define pii pair<int,int>
#define INF 2147483647
#define LL unsigned long long
using namespace std;
const double PI = acos(-1.0);
const int N=;
const int mod=; int a[N], p[N], bac[N]; int cal(int n,int L)
{
if(L==n) return ; int len, ans;
p[len=]=a[];
for(int i=; i+L<=n; i++)
{
if(a[i+L]>p[len]) bac[i+L]=len;
else bac[i+L]=lower_bound(p+,p+len+,a[i+L])-p-; if(a[i]>p[len]) p[++len]=a[i];
else *lower_bound(p+,p+len+,a[i])=a[i];
}
ans=max(len, bac[n]+);
memset(p,0x7f,sizeof(p)); //注意初始化 p[len=n]=a[n];
for(int i=n-; i>L; i--)
{
int big;
if(a[i]<p[len])
{
p[--len]=a[i];
big=n+-len + bac[i];
}
else
{
int pos=upper_bound(p+len,p+n+,a[i])-p-; //找到应插入的下标
p[pos]=a[i];
big=n+-pos + bac[i];
}
ans=max(ans, big);
}
return ans;
} int main()
{
//freopen("input.txt", "r", stdin);
int t, n, L, Case=;
cin>>t;
while(t--)
{
memset(p,-,sizeof(p)); //注意初始化
memset(bac,,sizeof(bac)); scanf("%d%d",&n,&L);
for(int i=; i<=n; i++) scanf("%d",&a[i]);
printf("Case #%d: %d\n", ++Case, cal(n,L));
}
}
AC代码
HDU 5489 Removed Interval (LIS,变形)的更多相关文章
- HDU 5489 Removed Interval (LIS变形)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5489 给你n个数,要删去其中连续的L个,问你删去之后的LIS最大是多少? 我们先预处理出以i下标为开头 ...
- 2015合肥网络赛 HDU 5489 Removed Interval LIS+线段树(树状数组)
HDU 5489 Removed Interval 题意: 求序列中切掉连续的L长度后的最长上升序列 思路: 从前到后求一遍LIS,从后往前求一遍LDS,然后枚举切开的位置i,用线段树维护区间最大值, ...
- hdu 5489——Removed Interval——————【删除一段区间后的LIS】
Removed Interval Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- HDU 5489 Removed Interval 2015 ACM/ICPC Asia Regional Hefei Online (LIS变形)
定义f[i]表示以i为开头往后的最长上升子序列,d[i]表示以i为结尾的最长上升子序列. 先nlogn算出f[i], 从i-L开始枚举f[i],表示假设i在最终的LIS中,往[0,i-L)里找到满足a ...
- 【二分】【最长上升子序列】HDU 5489 Removed Interval (2015 ACM/ICPC Asia Regional Hefei Online)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5489 题目大意: 一个N(N<=100000)个数的序列,要从中去掉相邻的L个数(去掉整个区间 ...
- HDU 5489 Removed Interval
题意:求一段序列中删掉L个连续元素后的LIS. 解法:我的想法很复杂= =怎么说呢……首先用nlogn的方法求LIS得到的序列dp的第i项的意义为上升子序列所有长度为i的序列结尾元素的最小值,那么先倒 ...
- HDU 5489 Removed Interval DP 树状数组
题意: 给一个长度为\(N\)的序列,要删除一段长为\(L\)的连续子序列,问所能得到的最长的\(LIS\)的长度. 分析: 设\(f(i)\)表示以\(a_i\)结尾的\(LIS\)的长度,设\(g ...
- LIS(变形) HDOJ 5489 Removed Interval
题目传送门 题意:求删掉连续L长度后的LIS 分析:记rdp[i]表示以a[i]为开始的LIS长度,用nlogn的办法,二分查找-a[i].dp[i]表示以a[i]为结尾并且删去[i-L-1, i-1 ...
- hdu 5256 序列变换 (LIS变形)
序列变换 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
随机推荐
- mysql 中sql语句的执行顺序
今天突然想起来,之前面试一个很牛逼的公司(soho)的时候,一个美眉面试官,面试的时候问到了很多之前都没有意识到的问题,回想起来那美眉看着年纪不大,技术那是真666啊.好了说一下人家问的这个有关mys ...
- 阿里云服务器,无法通过公网ip访问实例
昨天得知阿里云esc又打折了,赶紧入手了一波,因为以前有部署过的经验,所以很快就部署上了项目,就在欣喜的访问时,却无访问. 我按照下面步骤一步一步的检测, 1.服务器上是否成功部署jdk和tomcat ...
- linux私有ftp搭建与创建新用户
一.私有ftp搭建 以后补充 1. 搭建 2.修改配置文件 二.创建新用户 在linux搭建好私有ftp后,默认存放目录是 /var/ftp/ 我们有时候需要给外部公司之类的用,但又不想让他们直接在 ...
- Elasticsearch5.X Mapping详解
0.引言 在关系型数据库如Mysql中,设计库表需要注意的是: 1)需要几个表: 2)每个表有哪些字段: 3)表的主键及外键的设定——便于有效关联. 表的设计遵守范式约束,考虑表的可扩展性,避免开发后 ...
- Matcher的group()/group(int group)/groupCount()用法介绍
直接上代码: package com.dajiangtai.djt_spider.util; import java.util.regex.Matcher;import java.util.regex ...
- JQuery中查找父元素,子元素,追加元素,插入元素和删除元素 及其他常用方法
Jquery之所以强大,和其在获取对象时使用与css选择器兼容的语法有很大关系.而且它还兼容了CSS3的选择器,而且多出了不少. 所以jQuery的选择器也就变得很多很强大.就最基本的有以下四个: $ ...
- 建立JNI层的本地对象,并与JAVA层交互方法
最近在做OpenCV4Android开发的时候,需要从摄像头捕获多个图片,传值给本地对象,每次捕获到图片都更新数据,最后将计算得到的数据传给JAVA层,并在界面中显示.经过摸索和调试后,找到了通过本地 ...
- 【转】mysql数据库的数据类型
一.数值类型 Mysql支持所有标准SQL中的数值类型,其中包括: 严格数据类型(INTEGER,SMALLINT,DECIMAL,NUMBERIC ...
- SP2-0734: 未知的命令开头 “IMP ” - 忽略了剩余的行
描述 在cmd命令窗口中使用imp命令将dmp文件导入到oracle中时,出现了错误: SP2-0734: 未知的命令开头 “IMP ” - 忽略了剩余的行,如图 原因 imp命令是oracle提供的 ...
- 程序员收藏必看系列:深度解析MySOL优化(一)
说起MySQL的查询优化,相信大家收藏了一堆奇技淫巧:不能使用SELECT *.不使用NULL字段.合理创建索引.为字段选择合适的数据类型….. 你是否真的理解这些优化技巧?是否理解其背后的工作原理? ...