双端队列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 ...
随机推荐
- linux系统编码修改
1. 查看当前系统默认采用的字符集locale 2. 查看系统当前编码echo $LANG如果输出为:en_US.UTF-8 英文zh_CN.UTF-8 中文 3. 查看系统是否安装中 ...
- labuladong算法笔记总结
动态规划解题套路框架 学习计划: 最长回文子序列 〇.必读文章 1.数据结构和算法学习指南(学习算法和刷题的框架思维) 了解数据结构的操作和遍历(迭代or递归) 从树刷起,结合框架思维,有利于理解(回 ...
- 通过 CancellationToken 提高 Web 性能
在 Web 开发中,经常会遇到这样的场景:用户发起一个请求,Web 服务器执行一些计算密集型的操作,等待结果返回给用户.这种情况下,如果用户在等待结果的过程中取消了请求,那么服务器端依然会继续执行计算 ...
- jmeter 之 JSON 断言
1.JSON 断言所在位置:断言->JSON 断言 2.JSON断言中的字段解析 Assert JSON Path exists:json 表达式,判断所字段是否存在,存在则为True, 否则为 ...
- 重学c#系列—— 反射的基本理解[三十三]
前言 在上一章中介绍了什么是反射: https://www.cnblogs.com/aoximin/p/16440966.html 正文 上一节讲述反射的基本原理和为什么要用反射,还用反射的优缺点这些 ...
- [0x11] 131.直方图中最大的矩形【单调栈】
题意 link(more:SPOJ1805) 如图,在水平线上有 \(n(n\leqslant10^5)\) 个宽度为 1 ,高度为 \(h(0\leqslant h\leqslant10^9)\) ...
- 基于Chromium开发的称重软件,集称重、计价、打印于一体,支持耀华、顶尖等多个厂家设备型号
技术方案: 1.运行时使用.Net Framework4.6框架,界面使用WPF与Chromium. 2.上位机与下位机使用串口对接每家设备协议,上位机与UI使用WebSocket通讯. 3.数据库使 ...
- MySQL优化四,高性能优化
一,查询优化器 这个部分的整个过程是由MySQL的存储引擎来做的,优化器就会根据存储引擎来使用原来的开销, 优化后的开销,哪个更好一点? 1.如果是查询语句(select语句),首先会查询缓存是否已有 ...
- 千姿百态,瞬息万变,Win11系统NeoVim打造全能/全栈编辑器(前端/Css/Js/Vue/Golang/Ruby/ChatGpt)
我曾经多次向人推荐Vim,其热情程度有些类似现在卖保险的,有的时候,人们会因为一些弥足珍贵的美好暗暗渴望一个巨大的负面,比如因为想重温手动挡的快乐而渴望买下一辆二十万公里的老爷车,比如因为所谓完美的音 ...
- windows消息处理机制
三层机制 1.顶端就是Windows内核.Windows内核维护着一个消息队列,第二级控制中心从这个消息队列中获取属于自己管辖的消息,后做出处理,有些消息直接处理掉,有些还要发送给下一级窗体(Wind ...