前言

题目链接:洛谷SPOJHydro & bzoj

题意简述

有一个长度为 \(n\) 的序列,每个位置值的范围为 \([L_i, R_i]\) 内,求原序列可能的最长不降子串长度。

题目分析

尝试找一些性质。发现,连续一段合法的区间,都能分成若干真正参与最长不降子串,以及紧跟着的若干包含 \(L_i\) 的位置。下图红色表示前者,黑色表示后者。

我们把右端点向右移动,左端点肯定不会向左移动,是一个双指针。我们记 \(l\) 是当前左端点,现在让 \(r \gets r + 1\),看看左端点如何变化。发现不够,还要记 \(lst\) 表示上一个出现红色段的位置。那么分为以下几个情况讨论。

  1. \(L_r \leq L_{lst} \leq R_r\):

    说明这是一个黑色段,不需要任何操作。
  2. \(L_r \geq L_{lst}\):

    说明遇到了一个新的红色段,贡献了最长不降子串,让 \(lst \gets r\)。
  3. 此时必有 \(R_r < L_{lst}\):

    说明遇到上图绿色段的情况。我们要在 \(lst + 1 \sim r\) 里重新挑选出一个 \(l'\) 和 \(lst'\)。

前两者都很好处理,思考怎么弄第 \(3\) 条。

发现关键都在每条线段的下端,如果 \(l \sim r\) 里 \(\max L_i > R_{r}\),那么一定是不合法的,因为是不能下降的。所以考虑用 ST 表维护区间最小 \(L\) 的位置。遇到情况 \(3\),先让 \(l' \gets lst\),当 \(\max L_{l' \sim r} > R_{r}\),将 \(l' \gets l' +1\),至于 \(lst'\),就是最终 \(\max L_{l' \sim r}\) 的那个位置。

时间复杂度 \(\Theta(n \log n)\),瓶颈在于 ST 表。

继续思考,发现合法区间 \(l \sim r\) 的充要条件也是 \(\forall i \in [l, r], \max L_{l \sim i} \leq R_i\)。那么不需要那么麻烦,直接上双指针。如果 \(\max L_{l \sim r} > R_r\),\(l \gets l + 1\)。正确性显然。但是时间复杂度还是 \(\Theta(n \log n)\),能不能去掉 ST 表呢?

发现,我们要维护滑动窗口的最值,所以,上单调队列。队列里 \(L\) 从大到小排序。统计答案时,上一次弹出队列的位置 \(+ 1\) 就是合法的最长的左端点。

时空都是线性的。

代码

// #pragma GCC optimize(3)
// #pragma GCC optimize("Ofast", "inline", "-ffast-math")
// #pragma GCC target("avx", "sse2", "sse3", "sse4", "mmx")
#include <iostream>
#include <cstdio>
using namespace std; int n, L[1000010], R[1000010];
int Q[1000010], head = 1, tail;
int ans = 1; signed main() {
scanf("%d", &n);
for (int i = 1; i <= n; ++i) scanf("%d%d", &L[i], &R[i]);
for (int i = 1; i <= n; ++i) {
while (head <= tail && L[Q[head]] > R[i]) ++head;
if (head <= tail) ans = max(ans, i - Q[head - 1]);
while (head <= tail && L[Q[tail]] <= L[i]) --tail;
Q[++tail] = i;
}
printf("%d", ans);
return 0;
}

后记 & 反思

双指针,考虑好添加右端点后,怎么删去不合法的左端点。

Temperature 题解的更多相关文章

  1. BZOJ2276: [Poi2011]Temperature

    2276: [Poi2011]Temperature Time Limit: 20 Sec  Memory Limit: 32 MBSubmit: 293  Solved: 117[Submit][S ...

  2. Tsinghua 2018 DSA PA2简要题解

    反正没时间写,先把简要题解(嘴巴A题)都给他写了记录一下. upd:任务倒是完成了,我也自闭了. CST2018 2-1 Meteorites: 乘法版的石子合并,堆 + 高精度. 写起来有点烦貌似. ...

  3. POI2011题解

    POI2011题解 2214先咕一会... [BZOJ2212][POI2011]Tree Rotations 线段树合并模板题. #include<cstdio> #include< ...

  4. Codeforces Round #470 Div. 2题解

    A. Protect Sheep time limit per test 1 second memory limit per test 256 megabytes input standard inp ...

  5. BZOJ 2276: [Poi2011]Temperature 单调队列

    Code: #include<bits/stdc++.h> #define maxn 3000000 using namespace std; void setIO(string s) { ...

  6. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  7. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  8. [LeetCode] Rising Temperature 上升温度

    Given a Weather table, write a SQL query to find all dates' Ids with higher temperature compared to ...

  9. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  10. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

随机推荐

  1. mysql时间字段新增和修改默认时间,删除字段

    mysql时间字段新增和修改默认时间,删除字段##新增字段ALTER TABLE tbl_test ADD COLUMN `create_time` DATETIME NULL DEFAULT CUR ...

  2. Sqlite windows11 安装与使用

    首先进入Sqlite官方网址: https://www.sqlite.org/download.html 然后下载下面框起来的两个压缩文件 下载完成后解压 接下来去配置环境变量,右键此电脑->属 ...

  3. 实训day2

    HTML基本介绍 编辑网页的语言,超文本标记语言,是迄今为止网络上应用最为广泛的语言,也是抱成网页文档的主要语言.HTML文本是由HTML命令组成的描述性文本,HTML命令可以说明文字.图形.动画.声 ...

  4. Ubuntu禁止和启动内核更新

    ubuntu禁止和启动内核更新 https://www.cnblogs.com/passedbylove/p/13091002.html https://www.cnblogs.com/sparkde ...

  5. Python_9 py文件导入和路径处理

    一.查缺补漏 Python中两个值交换可以直接交换如:a,b=b,a 冒泡就是从小到大排序,因为越到后越大 自动导包也适用于自己创建的模块 关于正斜杠和反斜杠https://www.cnblogs.c ...

  6. 详解Web应用安全系列(8)不足的日志记录和监控

    在Web安全领域,不足的日志记录和监控是一个重要的安全隐患,它可能导致攻击者能够更隐蔽地进行攻击,同时增加了攻击被检测和响应的难度.以下是对Web攻击中不足的日志记录和监控漏洞的详细介绍. 一.日志记 ...

  7. Kubernetes(K8S)基本概念

    前言 有公司用 java 或 go , vue 或 react , linux 或 win ,但所有的大厂都在用k8s,没有或,而且是全世界.一个熟悉k8s的开发,薪资可以轻松上25的 base . ...

  8. DDP:微软提出动态detection head选择,适配计算资源有限场景 | CVPR 2022

    DPP能够对目标检测proposal进行非统一处理,根据proposal选择不同复杂度的算子,加速整体推理过程.从实验结果来看,效果非常不错 来源:晓飞的算法工程笔记 公众号 论文: Should A ...

  9. 搜索Python编程获取相关图书信息

    1.获取相关图书信息 #搜索"Python编程"获取相关图书信息 from selenium import webdriver from selenium.webdriver.su ...

  10. SQL_left join 和from 两个表的区别

    一个是普通的联接,结果中的记录在两个表中都有.一个是左外联接,结果中的记录在A表中存在,B表中不一定有.相当于a表为主体表,b为辅助表. 例子: mysql> select * from a;+ ...