Temperature 题解
前言
题目链接:洛谷;SPOJ;Hydro & bzoj。
题意简述
有一个长度为
题目分析
尝试找一些性质。发现,连续一段合法的区间,都能分成若干真正参与最长不降子串,以及紧跟着的若干包含
我们把右端点向右移动,左端点肯定不会向左移动,是一个双指针。我们记
:
说明这是一个黑色段,不需要任何操作。 :
说明遇到了一个新的红色段,贡献了最长不降子串,让 。- 此时必有
:
说明遇到上图绿色段的情况。我们要在 里重新挑选出一个 和 。
前两者都很好处理,思考怎么弄第
发现关键都在每条线段的下端,如果
时间复杂度
继续思考,发现合法区间
发现,我们要维护滑动窗口的最值,所以,上单调队列。队列里
时空都是线性的。
代码
// #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; }
后记 & 反思
双指针,考虑好添加右端点后,怎么删去不合法的左端点。
本文作者:XuYueming,转载请注明原文链接:https://www.cnblogs.com/XuYueming/p/18322711。
若未作特殊说明,本作品采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现