UVa 1471 (LIS变形) Defense Lines
题意:
给出一个序列,删掉它的一个连续子序列(该子序列可以为空),使得剩下的序列有最长的连续严格递增子序列。
分析:
这个可以看作lrj的《训练指南》P62中讲到的LIS的O(nlogn)的优化变形过来的问题。
预处理:
Li是第i个元素Ai向左延伸的最大长度,即[i, i + Li - 1]是一个递增区间
同样地,Ri是第i个元素向右延伸的最大长度。
我们,可以枚举i, j(j<i 且 Aj < Ai),这样就可以把Aj和Ai“拼接”起来,所得到的最长连续递增子列的长度就是Lj + Ri
继续优化:
对于某一个i,如果有La = Lb 且 Aa < Ab,则后一个状态一定不会比前一个状态更优,因为如果Ab和Ai能“拼接”上,Aa和Ai也一定能“拼接”上,所以只要保留Aa即可
所以,用一个数组g,gi记录向左延伸为i的最小的元素值。
用lower_bound找到gk ≥ Ai 的第一个下标,(k-1则是gk-1 < Ai 的最后一个下标),此时得到的最大长度为k-1+Ri
然后还要更新g的值,g[L[i]] = min(g[L[i]], A[i])
#include <bits/stdc++.h>
using namespace std; const int maxn = + ;
const int INF = ; int a[maxn], L[maxn], R[maxn], g[maxn]; bool scan_d(int &ret)
{
char c;
if(c=getchar(),c==EOF) return ; //EOF
while(c!='-'&&(c<''||c>'')) c=getchar();
ret=(c=='-')?:(c-'');
while(c=getchar(),c>=''&&c<='') ret=ret*+(c-'');
return ;
} int main()
{
//freopen("in.txt", "r", stdin); int T;
scan_d(T);
while(T--)
{
int n;
scan_d(n);
for(int i = ; i < n; ++i) scan_d(a[i]);
R[n-] = ;
for(int i = n-; i >= ; --i) R[i] = (a[i] < a[i+]) ? (R[i+] + ) : ;
L[] = ;
for(int i = ; i < n; ++i) L[i] = (a[i] > a[i-]) ? (L[i-] + ) : ; int ans = ;
for(int i = ; i <= n; ++i) g[i] = INF;
for(int i = ; i < n; ++i)
{
int k = lower_bound(g+, g++n, a[i]) - g;
ans = max(ans, R[i] + k - );
if(a[i] < g[L[i]]) g[L[i]] = a[i];
}
printf("%d\n", ans);
} return ;
}
代码君
UVa 1471 (LIS变形) Defense Lines的更多相关文章
- UVA - 1471 Defense Lines 树状数组/二分
Defense Lines After the last war devastated your country, you - as the ...
- UVA 437 巴比伦塔 【DAG上DP/LIS变形】
[链接]:https://cn.vjudge.net/problem/UVA-437 [题意]:给你n个立方体,让你以长宽为底,一个个搭起来(下面的立方体的长和宽必须大于上面的长和宽)求能得到的最长高 ...
- CSU 1551 Longest Increasing Subsequence Again(树状数组 或者 LIS变形)
题目链接:http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1551 升级版:Uva 1471 题意: 让你求删除一段连续的子序列之后的LIS. 题 ...
- 九度 1557:和谐答案 (LIS 变形)
题目描述: 在初试即将开始的最后一段日子里,laxtc重点练习了英语阅读的第二部分,他发现了一个有意思的情况.这部分的试题最终的答案总是如下形式的:1.A;2.C;3.D;4.E;5.F.即共有六个空 ...
- hdu 1087(LIS变形)
Super Jumping! Jumping! Jumping! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 ...
- 【二分】Defense Lines
[UVa1471] Defense Lines 算法入门经典第8章8-8 (P242) 题目大意:将一个序列删去一个连续子序列,问最长的严格上升子序列 (N<=200000) 试题分析:算法1: ...
- UVA 1471 Defense Lines 防线 (LIS变形)
给一个长度为n的序列,要求删除一个连续子序列,使剩下的序列有一个长度最大的连续递增子序列. 最简单的想法是枚举起点j和终点i,然后数一数,分别向前或向后能延伸的最长长度,记为g(i)和f(i).可以先 ...
- Uva 1471 Defense Lines(LIS变形)
题意: 给你一个数组,让你删除一个连续的子序列,使得剩下的序列中有最长上升子序列, 求出这个长度. 题解: 预处理:先求一个last[i],以a[i]为开始的合法最长上升子序列的长度.再求一个pre[ ...
- UVA - 1471 Defense Lines (set/bit/lis)
紫薯例题+1. 题意:给你一个长度为n(n<=200000)的序列a[n],求删除一个连续子序列后的可能的最长连续上升子序列的长度. 首先对序列进行分段,每一段连续的子序列的元素递增,设L[i] ...
随机推荐
- FireFox不支持InnerText的解决方法
innerText和InnerHTML是非常实用的一个属性,然而在FireFox中不支持此属性,可能是因为考虑到网页的安全性.这样一来为开发者带来了不少麻烦.FireFox中也提供了另外一个属性inn ...
- Spark Tungsten揭秘 Day1 jvm下的性能优化
Spark Tungsten揭秘 Day1 jvm下的性能优化 今天开始谈下Tungsten,首先我们需要了解下其背后是符合了什么样的规律. jvm对分布式天生支持 整个Spark分布式系统是建立在分 ...
- 另一个 SqlParameterCollection 中已包含 SqlParameter
出处:http://www.cnblogs.com/OldYongs/archive/2011/03/12/1982021.html#2742742 一般情况下,我们定义的一个SqlParameter ...
- 简单加密算法在C#中的实现
加密是指通过某种特殊的方法,更改已有信息的内容,是的未授权的用户即使得到了加密的信息,如果没有正确的解密算法,那么也无法得到信息的内容. 方法一: //须添加对System.Web的引用 using ...
- 洛谷 P1858 多人背包
求01背包前k优解的价值和 输入输出格式 Input/output 输入格式:第一行三个数K.V.N(k<=50,v<=5000,n<=200)接下来每行两个数,表示体积和价值输出格 ...
- Sugarcrm Email Integration
Introdurce http://www.sugarcrm.com/feature/email-integration Tutor http://www.youtube.com/watch?v=BQ ...
- python解决汉诺塔问题
今天刚刚在博客园安家,不知道写点什么,前两天刚刚学习完python 所以就用python写了一下汉诺塔算法,感觉还行拿出来分享一下 首先看一下描述: from :http://baike.baidu. ...
- xcode 上 crash 调试的三种方法
最近有新人问crash调试方法,简介记录如下: 模拟器调试 打开控制台查看输出日志 显示出错的行数 显示出错的函数iOS Crash跟踪 真机调试 首先修改真机调试的 bundle ID,使代码可以进 ...
- c++ 发布动态.so
原文地址 代码改变世界 Posts - 105, Articles - 0, Comments - 1561 Cnblogs Dashboard Logout Home Contact Gallery ...
- bzoj 2876: [Noi2012]骑行川藏 拉格朗日数乘
2876: [Noi2012]骑行川藏 Time Limit: 20 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 1033 Solved: ...