题目大意

有 \(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. 关于mysql在linux(deb系)遇到的问题及解决方法

    前言 当我在树莓派上安装 mysql 数据库的时候,默认安装的是mariadb 数据库,不过没什么区别(在我看来),然后就是闹心的解决各种问题了 1. mysql 在root用户下无密码登录问题 这个 ...

  2. Apache手动安装教程及报错解决梳理

    操作参考教程:https://www.cnblogs.com/haw2106/p/9839655.html 下载地址(例):wget https://dlcdn.apache.org/httpd/ht ...

  3. labuladong算法笔记总结

    动态规划解题套路框架 学习计划: 最长回文子序列 〇.必读文章 1.数据结构和算法学习指南(学习算法和刷题的框架思维) 了解数据结构的操作和遍历(迭代or递归) 从树刷起,结合框架思维,有利于理解(回 ...

  4. PW4052 是一颗适用于单节锂电池的、具有恒压/恒流充电模式的充电管理 IC

    PW4052 是一颗适用于单节锂电池的.具有恒压/恒流充电模式的充电管理 IC.该芯片采用开关型的工作模式, 能够为单节锂电池提供快速. 高效且简单的充电管理解决方案.PW4052 采用三段式充电管理 ...

  5. pycharm 小技巧

    ctrl键 + B 查看定义源代码 alt键 + enter键 查看帮助 ctrl键 + shift键 + -号 所有代码隐藏 ctrl键 + shift键 + +号 所有代码展示 ctrl键 + D ...

  6. java逻辑运算中 | | 和 | 的区别

    本文主要阐明逻辑运算中 | |(短路或) 和 |(逻辑或) 的异同 | | 和 | 的相同之处: 只有二者都是假时,结果才为假,否则结果为true. | | 和 | 的不同之处在于: a | | b: ...

  7. 物联网 IOT 设备如何脱离信息孤岛?

    以下内容为本人的学习笔记,如需要转载,请声明原文链接微信公众号「englyf」https://mp.weixin.qq.com/s/tb5eOFNUZLtPPLipLAh3vA 本文大概 1435 个 ...

  8. 中国蚁剑 - AntSword

    中国蚁剑 - AntSword 中国蚁剑是一种跨平台操作工具,它主要提供给用户用于有效的网络渗透测试以及进行正常运行的网站. 否则任何人不得将网站用于其无效用途以及可能的等目的.自己承担并追究其相关责 ...

  9. BBS项目(二): 登录功能 首页导航条搭建 首页主体部分 个人站点页面搭建 文章分类与标签 日期归档

    目录 登录功能 pillow模块生成验证码 前端发送ajax请求 后端auth模块校验 sweetalert弹窗提示登录失败 首页导航条搭建 修改密码 退出登录 首页主体部分 首页前端框架搭建 adm ...

  10. Nodejs报错记录

    ◉ digital envelope routines::unsupported D:\workspace\vuedemo> npm run dev ... error:0308010C:dig ...