当前位置: 首页 > news >正文

C++ 单调队列

单调队列:先进先出,是一个双端队列,队首只能删除元素,队尾可以进行插入和删除

单调队列代码框架

#include<iostream>
#include<deque>
using namespace std;/* 单调队列模版 */
#define maxn 100001template<typename T>
bool max(T a, T b) {return a <= b;
}template<typename T>
bool min(T a, T b) {return a >= b;
}
//给定一个长度为n的序列
//并且一个区间长度k
//求出所有长度不超过k的连续区间中的最大值(最小值)
template<typename T>
void findIntervalMinMax(int n, T h[], int k, T ans[], bool (*cmp)(T a, T b)) {// ans[i]代表的是以i为结尾的,且最大长度为k的区间里面的最大值(最小值)deque<int> q;for (int i = 0; i < n; ++i) {while (!q.empty() && cmp(h[q.back()], h[i])) {q.pop_back();}q.push_back(i);while (q.back() - q.front() + 1 > k) {q.pop_front();}// ans[i]代表以i结尾, 且长度不超过k的区间中,元素的最大值(最小值)ans[i] = h[q.front()];}}
/* 单调队列模版 */int main() {int h[] = { 8, 7, 6, 9, 11 };int ans[10];findIntervalMinMax(5, h, 3, ans, max);for (int i = 0; i < 5; ++i) {cout << ans[i] << " ";}cout << endl;findIntervalMinMax(5, h, 3, ans, min);for (int i = 0; i < 5; ++i) {cout << ans[i] << " ";}cout << endl;
}

代码练习1 对应洛谷 滑动窗口 代码见下

#include<iostream>
#include<deque>
using namespace std;/* 单调队列模版 */
#define maxn 1000001template<typename T>
bool max(T a, T b) {return a <= b;
}template<typename T>
bool min(T a, T b) {return a >= b;
}
//给定一个长度为n的序列
//并且一个区间长度k
//求出所有长度不超过k的连续区间中的最大值(最小值)
template<typename T>
void findIntervalMinMax(int n, T h[], int k, T ans[], bool (*cmp)(T a, T b)) {// ans[i]代表的是以i为结尾的,且最大长度为k的区间里面的最大值(最小值)deque<int> q;for (int i = 0; i < n; ++i) {while (!q.empty() && cmp(h[q.back()], h[i])) {q.pop_back();}q.push_back(i);while (q.back() - q.front() + 1 > k) {q.pop_front();}// ans[i]代表以i结尾, 且长度不超过k的区间中,元素的最大值(最小值)ans[i] = h[q.front()];}}
/* 单调队列模版 */int h[maxn], ans[maxn];int main() {int n, k;cin >> n >> k;for (int i = 0; i < n; ++i) {cin >> h[i];}findIntervalMinMax(n, h, k, ans, min);for (int i = k - 1; i < n; ++i) {cout << ans[i] << " ";}cout << endl;findIntervalMinMax(n, h, k, ans, max);for (int i = k - 1; i < n; ++i) {cout << ans[i] << " ";}cout << endl;return 0;
}

代码练习2 对应蓝桥云课 MAX最值差 代码见下

#include<iostream>
#include<deque>
using namespace std;/* 单调队列模版 */
#define maxn 1000001template<typename T>
bool max(T a, T b) {return a <= b;
}template<typename T>
bool min(T a, T b) {return a >= b;
}
//给定一个长度为n的序列
//并且一个区间长度k
//求出所有长度不超过k的连续区间中的最大值(最小值)
template<typename T>
void findIntervalMinMax(int n, T h[], int k, T ans[], bool (*cmp)(T a, T b)) {// ans[i]代表的是以i为结尾的,且最大长度为k的区间里面的最大值(最小值)deque<int> q;for (int i = 0; i < n; ++i) {while (!q.empty() && cmp(h[q.back()], h[i])) {q.pop_back();}q.push_back(i);while (q.back() - q.front() + 1 > k) {q.pop_front();}// ans[i]代表以i结尾, 且长度不超过k的区间中,元素的最大值(最小值)ans[i] = h[q.front()];}}
/* 单调队列模版 */int h[maxn], G[maxn], F[maxn];int main() {int n, k;cin >> n >> k;for (int i = 0; i < n; ++i) {cin >> h[i];}findIntervalMinMax(n, h, k, G, max);findIntervalMinMax(n, h, k, F, min);int ret = -1000000000;for (int i = 0; i < n; ++i) {int v = G[i] - F[i];if (v > ret) {ret = v;}}cout << ret << endl;return 0;
}

http://www.dtcms.com/a/550588.html

相关文章:

  • 湖南省建设工程造价管理总站微网站是官网的手机站
  • 上证50期权的到期日期是什么时候?
  • 网站开发看谁的教程成都企业模板网站开发
  • 【.NET】WinForm中如何调整DataGridView控件的列宽?
  • 用asp.net做网站的书凡科h5制作
  • 请别人做网站会不会被盗枣庄建设局网站
  • 网站优化的意义跨境电商营销推广
  • 如何建网站要什么条件做网站国外网站
  • SAP 实施顾问全景指南
  • CS144 知识笔记一(网络概述)
  • 智慧团建网站没有验证码wordpress 说说功能
  • 嘉兴网站制作推广京东云wordpress
  • PostgreSQL 索引损坏问题排查以及修复
  • 网站建设步骤和流程秦皇岛市属于哪个省
  • 低价自适应网站建设贵阳建站
  • Rust 泛型参数的使用:从类型抽象到编译期优化的深度实践
  • 【Rust编程】深入解析 Rust gRPC 框架:Tonic
  • 建设银行指定网站wordpress站群模板
  • CSP-J教程——第一阶段——第二课:变量与数据类型
  • ie6网站模板西固网站建设平台
  • 网站建设公司大型区域工业互联网平台
  • Linux文件层次结构
  • qRT-PCR 分析
  • python进阶教程1:枚举值和类型标注
  • 网站及备案wordpress 2.5
  • 机器视觉在半导体行业的重要性(以51camera晶圆隐裂检测系统为例)
  • ComfyUI 参数说明手册:核心节点与参数详细说明
  • 浅析数据库多租户
  • 【数据库】增删改查 高阶(超级详细)保姆级教学
  • 宁波市网站建设福鼎整站优化