题意:

  给你一个数组,让你删除一个连续的子序列,使得剩下的序列中有最长上升子序列, 求出这个长度。

题解:

  预处理:先求一个last[i],以a[i]为开始的合法最长上升子序列的长度。再求一个pre[i],以a[i]为结尾的合法最长上升子序列长度。

  那么这题的答案就是:max(pre[j]) + last[i]。(j<=a[i] - 1)。

  例如a[i]为3的话, 答案就是max(以1结尾的LIS长度, 以2结尾的LIS长度) + 以3开始LIS长度。

  dis[i] 是 LIS 长度为i的时候,最小的a[i]。(详细请看LIS nlogn算法)

  所以

  len = (lower_bound(dis+1, dis+1+i, a[i]) - (dis+1)) + last[i]。//二分查找

  ans = max (ans, len);

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <string>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <sstream>
#include <algorithm>
using namespace std;
#define pb push_back
#define mp make_pair
#define ms(a, b) memset((a), (b), sizeof(a))
//#define LOCAL
#define eps 0.0000001
typedef long long LL;
const int inf = 0x3f3f3f3f;
const LL INF = 0x7fffffff;
const int maxn = +;
const int mod = ;
int a[maxn];
int last[maxn];
int pre[maxn];
int dis[maxn];
void solve()
{
int n;
scanf("%d", &n);
for(int i=;i<=n;i++) scanf("%d", &a[i]);
ms(pre, );
ms(last, );
last[n] = ;
for(int i=n-;i>;i--){
if(a[i] < a[i+]){
last[i] = last[i+] + ;
}else last[i] = ;
}
pre[] = ;
for(int i= ;i<=n;i++){
if(a[i] > a[i-]){
pre[i] = pre[i-] + ;
}else pre[i] = ;
}
for(int i=;i<=n;i++) dis[i] = inf;
int ans = ;
for(int i=;i<=n;i++){
int len = (lower_bound(dis+, dis++i, a[i]) -(dis+))+ last[i];
ans = max(ans, len);
dis[pre[i]] = min(a[i], dis[pre[i]]);
}
printf("%d\n", ans);
}
int main() {
#ifdef LOCAL
freopen("jumping.in", "r", stdin);
// freopen("output.txt", "w", stdout);
#endif // LOCAL
int t;
scanf("%d", &t);
while(t--){
solve();
}
return ;
}

最新文章

  1. mysql在linux下修改存储路径
  2. iOS中如何选择delegate、通知、KVO(以及三者的区别)
  3. 树形DP水题杂记
  4. HDU-I Hate It
  5. CSRF - 空Referer绕过
  6. [Environment Build] Maven环境配置
  7. android数据库操作之直接读取db文件
  8. RocketMQ在linux平台下环境搭建
  9. inux 下c/c++ 连接mysql数据库全过程-----已经通过验证
  10. GDB调试GCC(jRate)
  11. poj1364(差分约束系统)
  12. Linux学习 -- 服务管理
  13. Android Studio 修改主题
  14. 利用反射动态从程序集dll执行方法和属性
  15. mysql单独可连接,php连接mysql失败之 Can&#39;t connect to local MySQL server through socket &#39;/var/lib/mysql/mysql.sock&#39; (2)
  16. centos7创建新用户
  17. 蒟蒻浅谈树链剖分之一——两个dfs操作
  18. haproxy反向代理
  19. 以太坊测试网络搭建以及RPC服务开启-配置注意事项
  20. Leetcode 234 Palindrome Linked List 复杂度为时间O(n) 和空间(1)解法

热门文章

  1. js json中的时间转换格式
  2. ementUi rules表单验证 --》Wangqi
  3. Console.Out 属性和 XmlDocument.Save 方法 (String)
  4. Leveldb源码分析--2
  5. [Python3 练习] 009 利用列表隐藏并找到有用的信息
  6. py基础
  7. [2019杭电多校第五场][hdu6624]fraction
  8. dfs找环
  9. controller函数中参数列表使用多个@RequestBody
  10. ES6——generator-yield