Uva 1471 Defense Lines(LIS变形)
2024-10-07 10:33:43
题意:
给你一个数组,让你删除一个连续的子序列,使得剩下的序列中有最长上升子序列, 求出这个长度。
题解:
预处理:先求一个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 ;
}
最新文章
- mysql在linux下修改存储路径
- iOS中如何选择delegate、通知、KVO(以及三者的区别)
- 树形DP水题杂记
- HDU-I Hate It
- CSRF - 空Referer绕过
- [Environment Build] Maven环境配置
- android数据库操作之直接读取db文件
- RocketMQ在linux平台下环境搭建
- inux 下c/c++ 连接mysql数据库全过程-----已经通过验证
- GDB调试GCC(jRate)
- poj1364(差分约束系统)
- Linux学习 -- 服务管理
- Android Studio 修改主题
- 利用反射动态从程序集dll执行方法和属性
- mysql单独可连接,php连接mysql失败之 Can&#39;t connect to local MySQL server through socket &#39;/var/lib/mysql/mysql.sock&#39; (2)
- centos7创建新用户
- 蒟蒻浅谈树链剖分之一——两个dfs操作
- haproxy反向代理
- 以太坊测试网络搭建以及RPC服务开启-配置注意事项
- Leetcode 234 Palindrome Linked List 复杂度为时间O(n) 和空间(1)解法