双端队列xLIS问题
题目大意
有 \(N\) 个数 \(A_i\) ,他准备将他们依次插入一个双端队列(每次可以在头或尾插入一个元素),最后将
整个队列从尾到头看成一个序列,求出最长上升子序列的长度 。他想知道 , \(L\) 的最大值是多少。
分析
很简单,考虑一个数,构造有它的最长上升子序列
把比他小的放他前面,比他大的放它后面
比他小的最优的就是以某一个比他小的数为开头的最长下降子序列的长度
比他大的最优的就是以它为开头的最长上升子序列的长度
最后相加取最大值即可
线段树维护 \(O(N \log N)\)
\(Code\)
#include<cstdio>
#include<iostream>
#include<algorithm>
#define ls (k << 1)
#define rs (ls | 1)
using namespace std;
const int N = 1e5 + 5;
int n , a[N] , f[N] , g[N] , V , seg[N * 4] , b[N];
void build(int l , int r , int k)
{
if (l == r)
{
seg[k] = 0;
return;
}
int mid = (l + r) >> 1;
build(l , mid , ls) , build(mid + 1 , r , rs);
seg[k] = max(seg[ls] , seg[rs]);
}
void update(int l , int r , int k , int x , int v)
{
if (l == r && l == x)
{
seg[k] = v;
return;
}
int mid = (l + r) >> 1;
if (x <= mid) update(l , mid , ls , x , v);
else update(mid + 1 , r , rs , x , v);
seg[k] = max(seg[ls] , seg[rs]);
}
int query(int l , int r , int k , int tl , int tr)
{
if (tl > tr) return 0;
if (tl <= l && r <= tr) return seg[k];
int mid = (l + r) >> 1 , res = 0;
if (tl <= mid) res = max(res , query(l , mid , ls , tl , tr));
if (tr > mid) res = max(res , query(mid + 1 , r , rs , tl , tr));
return res;
}
int main()
{
freopen("dequexlis.in" , "r" , stdin);
freopen("dequexlis.out" , "w" , stdout);
scanf("%d" , &n);
for(register int i = 1; i <= n; i++)
scanf("%d" , a + i) , b[i] = a[i];
sort(b + 1 , b + n + 1);
int len = unique(b + 1 , b + n + 1) - b - 1;
for(register int i = 1; i <= n; i++)
a[i] = lower_bound(b + 1 , b + len + 1 , a[i]) - b;
V = n + 1;
build(1 , n , 1);
for(register int i = n; i; i--)
{
f[i] = query(1 , n , 1 , a[i] + 1 , V) + 1;
update(1 , n , 1 , a[i] , f[i]);
}
build(1 , n , 1);
for(register int i = n; i; i--)
{
g[i] = query(1 , n , 1 , 1 , a[i] - 1) + 1;
update(1 , n , 1 , a[i] , g[i]);
}
build(1 , n , 1);
for(register int i = 1; i <= n; i++) update(1 , n , 1 , a[i] , g[i]);
int ans = 0;
for(register int i = 1; i <= n; i++)
ans = max(ans , query(1 , n , 1 , 1 , a[i] - 1) + f[i]);
printf("%d" , ans);
}
双端队列xLIS问题的更多相关文章
- lintcode二叉树的锯齿形层次遍历 (双端队列)
题目链接: http://www.lintcode.com/zh-cn/problem/binary-tree-zigzag-level-order-traversal/ 二叉树的锯齿形层次遍历 给出 ...
- lintcode 滑动窗口的最大值(双端队列)
题目链接:http://www.lintcode.com/zh-cn/problem/sliding-window-maximum/# 滑动窗口的最大值 给出一个可能包含重复的整数数组,和一个大小为 ...
- STL---deque(双端队列)
Deque是一种优化了的.对序列两端元素进行添加和删除操作的基本序列容器.它允许较为快速地随机访问,但它不像vector 把所有的对象保存在一块连续的内存块,而是采用多个连续的存储块,并且在一个映射结 ...
- hdu-5929 Basic Data Structure(双端队列+模拟)
题目链接: Basic Data Structure Time Limit: 7000/3500 MS (Java/Others) Memory Limit: 65536/65536 K (Ja ...
- HDU 4286 Data Handler --双端队列
题意:有一串数字,两个指针,然后一些添加,删除,反转,以及移动操作,最后输出序列. 解法:可以splay做,但是其实双端队列更简便. 维护三个双端队列LE,MI,RI分别表示[L,R]序列左边,[L, ...
- 双端队列(单调队列)poj2823 区间最小值(RMQ也可以)
Sliding Window Time Limit: 12000MS Memory Limit: 65536K Total Submissions: 41844 Accepted: 12384 ...
- Java 集合深入理解(10):Deque 双端队列
点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 什么是 Deque Deque 是 Double ended queue (双端队列) 的缩写,读音和 deck 一样,蛋 ...
- BZOJ2457 BeiJing2011 双端队列
[问题描述] Sherry现在碰到了一个棘手的问题,有N个整数需要排序. Sherry手头能用的工具就是若干个双端队列. 她需要依次处理这N个数,对于每个数,Sherry能做以下两件事 ...
- Fork/Join框架之双端队列
简介 ForkJoinPool管理着ForkJoinWorkerThread线程,ForkJoinWorkerThread线程内部有一个双端队列,这个双端队列主要由一个数组queue.数组下标queu ...
- 【贪心】Bzoj 2457:[BeiJing2011]双端队列
2457: [BeiJing2011]双端队列 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 209 Solved: 95[Submit][Stat ...
随机推荐
- elasticsearch的教程
简介: 假期自学了elasticsearch搭建与使用,写个博客记录一下 另外我电脑是linux,我懒得再说windows各种配置方法了,不过都是大同小异 1.软件的简介 ElasticSearch是 ...
- day26-过滤器Filter
Filter过滤器 1.Filter过滤器说明 为什么需要过滤器? 先来看一个例子: 我们在登录网站页面时,需要先进行登录验证. 用户访问的正常的流程应该是: 用户先通过登录页面进行验证,然后才可以访 ...
- 【Java并发入门】02 Java内存模型:看Java如何解决可见性和有序性问题
如何解决其中的可见性和有序性导致的问题,这也就引出来了今天的主角--Java 内存模型. 一.什么是 Java 内存模型? 导致可见性的原因是缓存,导致有序性的原因是编译优化,那解决可见性.有序性最直 ...
- Excel2010工作簿被锁定,无法复制或者新增加sheet表格。
Sub 工作簿密码破解() ActiveWorkbook.Sheets.Copy For Each sh In ActiveWorkbook.Sheets sh.Visible = True Next ...
- 【每日一题】2022年2月10日-NC160 二分查找-I
描述请实现无重复数字的升序数组的二分查找 给定一个 元素升序的.无重复数字的整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标(下标 ...
- filter: hue-rotate() 制作炫酷的文字效果
主要用到属性有: filter 滤镜的 hue-rotate 色调旋转, text-shadow 文字阴影, transform 的 scale缩放, transition 过渡属性, animati ...
- 万字干货|Synchronized关键字详解
作者:小牛呼噜噜 | https://xiaoniuhululu.com 计算机内功.JAVA底层.面试.职业成长相关资料等更多精彩文章在公众号「小牛呼噜噜」 前言 大家好,我是呼噜噜,在之前的文章中 ...
- RestTemplate获取json数组
1.需求描述 接口返回的是一个json数组,要获取到接口返回值并用实体类list接住. 2.解决方法 使用springboot框间自带的Http的工具类RestTemplate调接口,其返回值用hut ...
- 浅谈Java并发
Java并发是比较难的知识点,难于对并发的理解.并发要从操作系统和硬件层面去理解,才会比较深入,而不单单是从编程语言的逻辑去理解. 首先对于并发要清楚的几点: 线程可能在任何时刻被切换.计算机只对硬件 ...
- 完整数据分析流程:Python中的Pandas如何解决业务问题
开篇 作为万金油式的胶水语言,Python几乎无所不能,在数据科学领域的作用更是不可取代.数据分析硬实力中,Python是一个非常值得投入学习的工具. 这其中,数据分析师用得最多的模块非Pandas莫 ...