题目大意

有 \(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问题的更多相关文章

  1. lintcode二叉树的锯齿形层次遍历 (双端队列)

    题目链接: http://www.lintcode.com/zh-cn/problem/binary-tree-zigzag-level-order-traversal/ 二叉树的锯齿形层次遍历 给出 ...

  2. lintcode 滑动窗口的最大值(双端队列)

    题目链接:http://www.lintcode.com/zh-cn/problem/sliding-window-maximum/# 滑动窗口的最大值 给出一个可能包含重复的整数数组,和一个大小为  ...

  3. STL---deque(双端队列)

    Deque是一种优化了的.对序列两端元素进行添加和删除操作的基本序列容器.它允许较为快速地随机访问,但它不像vector 把所有的对象保存在一块连续的内存块,而是采用多个连续的存储块,并且在一个映射结 ...

  4. hdu-5929 Basic Data Structure(双端队列+模拟)

    题目链接: Basic Data Structure Time Limit: 7000/3500 MS (Java/Others)    Memory Limit: 65536/65536 K (Ja ...

  5. HDU 4286 Data Handler --双端队列

    题意:有一串数字,两个指针,然后一些添加,删除,反转,以及移动操作,最后输出序列. 解法:可以splay做,但是其实双端队列更简便. 维护三个双端队列LE,MI,RI分别表示[L,R]序列左边,[L, ...

  6. 双端队列(单调队列)poj2823 区间最小值(RMQ也可以)

    Sliding Window Time Limit: 12000MS   Memory Limit: 65536K Total Submissions: 41844   Accepted: 12384 ...

  7. Java 集合深入理解(10):Deque 双端队列

    点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 什么是 Deque Deque 是 Double ended queue (双端队列) 的缩写,读音和 deck 一样,蛋 ...

  8. BZOJ2457 BeiJing2011 双端队列

    [问题描述] Sherry现在碰到了一个棘手的问题,有N个整数需要排序.  Sherry手头能用的工具就是若干个双端队列.        她需要依次处理这N个数,对于每个数,Sherry能做以下两件事 ...

  9. Fork/Join框架之双端队列

    简介 ForkJoinPool管理着ForkJoinWorkerThread线程,ForkJoinWorkerThread线程内部有一个双端队列,这个双端队列主要由一个数组queue.数组下标queu ...

  10. 【贪心】Bzoj 2457:[BeiJing2011]双端队列

    2457: [BeiJing2011]双端队列 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 209  Solved: 95[Submit][Stat ...

随机推荐

  1. day13 I/O流——字节输入输出流、字符输入输出流 & File常用类 & (字节)复制大文件

    day13 I/O流 定义:数据在两设备传输称为流,流是一组有顺序的,有起点和终点的字节集合 I 是input的缩写,表示输入流 O是output缩写,表示输出流 字节流(视频等) 输入InputSt ...

  2. Django的manytomany字段

    manytomany字段 用于表示多对多的关系,最常见的就是老师和班级的例子 一个老师可以教多个班级,一个班级也可以有多个老师 add 添加关系 teachers=models.Teacher.obj ...

  3. 2.2:常用的Python数据类型、字符串、dtype

    一.内置数据类型 1.整型 2.浮点型 3.字符串 4.复数 5.布尔类型bool 6.None类型 二.字符串 1.从键盘输入数据 s = input() 2.用eval去引号求值 eval(&qu ...

  4. 【Java EE】Day10 JavaScript高级、DOM、BOM、事件

    一.简单入门 1.DOM 功能:获取html文档内容 代码:document.getElementById("id值") 功能: 设置属性值 修改标签体内容:xx.innerHtm ...

  5. form表单里的button 等元素不能使用margin: 0 auto;

    记得把form和button都设为display:block; 就能用margin: 0 auto;水平居中了

  6. redis集合 实现 队列

    先说一下需求:用队列解决 流量削峰,主要应用场景:商城秒杀功能. 以下是业务流程图可以参考一下: 然后本地实现思路 截图下单页面 每次购买数量会减少1,设置了1000个库存,用户id 是随机生成的. ...

  7. python基础语法&数据类型&运算符

    1.标识符 # -*- coding:utf-8 -*- # @Time :2021/1/16 10:28 # @Author :QAbujiaban # @Email :wbxztoo@163.co ...

  8. java中的复合赋值运算符

    本文主要阐明复合赋值运算符 即 i = i+ 1.2 ==> i += 1.2: int i = 1; i += 1.2; System.out.println(i); // i == 2 注意 ...

  9. des_招标

    网站 aHR0cHM6Ly9jdGJwc3AuY29tLyMv 翻到第二页,加载了一个2,并且返回的都是加密的数据  点到initiator,可以看到发送的Axios请求,尝试全局搜索intercep ...

  10. 温故知新 - 靶机练习-Toppo

    今天闲来无事,重新做了一下以前做过的第一个靶机(https://www.cnblogs.com/sallyzhang/p/12792042.html),这个靶机主要是练习sudo提权,当时不会也没理解 ...