單調棧和單調隊列

一、單調棧

1、使用場景

解決元素左 / 右側第一個比他大 / 小的數字。

2、原理解釋

用棧解決,目標是棧頂存儲答案。

以元素左側第一個比他小為例:

(1)遍歷順序一定是從左向右。

(2)由于棧頂一定是答案,所以如果棧頂比遍歷到的元素大或相等,那就是不合法的,此時一直出棧。?

(3)一直到棧空或棧頂比元素小,分別表示元素左邊沒有數比元素小和元素左邊有數比元素小。更新答案。

(4)此時不管怎么樣都把元素入棧,因為這個元素可能會是之后的答案。

3、代碼

例題:單調棧

P5788 【模板】單調棧 - 洛谷

// https://www.luogu.com.cn/problem/P5788
#include "bits/stdc++.h"
using namespace std;
// 找到右邊大的數
// 除非我遍歷到的這個數比頂大我才一直出棧(循環解決),棧為空那就是右邊沒有比我大的我入棧,棧不為空那說說明右邊有比我大的我入棧
const int N = 1e7;
int a[N];
int ans[N];int main()
{int n;cin >> n;for(int i = 1; i <= n; i++)cin >> a[i];stack<int> st;for(int i = n; i >= 1; i--){while(st.size() && a[st.top()] <= a[i])st.pop();if(st.empty()){st.push(i);ans[i] = 0;}else {ans[i] = st.top();st.push(i);}}for(int i = 1; i <= n; i++){cout << ans[i] << ' ';}return 0;
}

4、例題

發射站

P1901 發射站 - 洛谷

// https://www.luogu.com.cn/problem/P1901
#include "bits/stdc++.h"
using namespace std;
#define ll long long
// 兩個數組:
// 左邊離塔最近的高于這個塔的下標
// 右邊離塔最近的高于這個塔的下標
// 兩個棧分別找到
// 加能量應該是左邊比塔高的那個塔加這個塔的能量,top += i
const int N = 1e6 + 10;int sum[N]; // 對應下標的塔接受的能量
int v[N]; // 塔的高度
int e[N]; // 塔的能量
int ans = 0;
int main()
{int n;cin >> n;for(int i = 1; i <= n; i++)cin >> v[i] >> e[i];stack<int> st1;stack<int> st2;for(int i = 1; i <= n; i++){while(st1.size() && v[i] >= v[st1.top()])st1.pop();if(st1.size()){sum[st1.top()] += e[i];}st1.push(i);}for(int i = n; i >= 1; i--){while(st2.size() && v[i] >= v[st2.top()])st2.pop();if(st2.size()){sum[st2.top()] += e[i];}st2.push(i);}for(int i = 1; i <= n; i++){ans = max(ans, sum[i]);}cout << ans;return 0;
}

二、單調隊列

1、使用場景

滑動窗口極值問題。

2、原理解釋

用隊列,目標是隊頭是答案。

以滑動窗口中的極大值為例:

(1)因為隊頭是窗口中的最大值,所以一個元素要入隊尾插那一定是盡可能向前走,即比元素小的或相等的(剛進來的元素不容易被淘汰,所以相等的老東西也要走)全部尾刪。

(2)最后隊為空或者尾刪停下后,更新尾插。

(3)解決完入隊邏輯之后還要解決數據過期,即不在窗口內的元素要清除,所以在每次插入新元素之后對于下標過期的數據循環頭刪。

3、代碼

例題:單調隊列

P1886 滑動窗口 /【模板】單調隊列 - 洛谷

// https://www.luogu.com.cn/problem/P1886
#include "bits/stdc++.h"
using namespace std;
const int N = 1e6 + 10;
int a[N];
// 雙端隊列,存下標防止數據過期
// 最小值:隊為空直接加,來的數比隊尾大不一定就不是后面的答案尾插,來的數比隊尾小或等于可以競爭這個范圍內的最小值,所以一直尾刪。每次最后清除所有不合法下標。
// 最大值:隊為空直接加,來的數比隊尾小不一定就不是后面的答案尾插,來的數比隊尾大或等于可以競爭這個范圍內的最大值,所以一直尾刪。每次最后清除所有不合法下標。
int main()
{int n, k;deque<int> dq1;deque<int> dq2;cin >> n >> k;for(int i = 1; i <= n; i++)cin >> a[i];// 最小for(int i = 1; i <= n; i++){while(dq1.size() && a[i] <= a[dq1.back()]) dq1.pop_back();dq1.push_back(i);while(dq1.front() <= i - k)dq1.pop_front();if(i >= k)cout << a[dq1.front()] << ' ';}cout << endl;// 最大for(int i = 1; i <= n; i++){while(dq2.size() && a[i] >= a[dq2.back()]) dq2.pop_back();dq2.push_back(i);while(dq2.front() <= i - k)dq2.pop_front();if(i >= k)cout << a[dq2.front()] << ' ';}return 0;
}

4、例題

1、質量檢測

P2251 質量檢測 - 洛谷

// https://www.luogu.com.cn/problem/P2251
#include "bits/stdc++.h"
using namespace std;
const int N = 1e6 + 10;
int a[N];
int main()
{int n, m;cin >> n >> m;for(int i = 1; i <= n; i++)cin >> a[i];deque<int> dq;for(int i = 1; i <= n; i++){while(dq.size() && a[i] <= a[dq.back()])dq.pop_back();dq.push_back(i);while(dq.front() <= i - m)dq.pop_front();if(i >= m)cout << a[dq.front()] << endl;}return 0;
}

2、HISTOGRA - Largest Rectangle in a Histogram

SP1805 HISTOGRA - Largest Rectangle in a Histogram - 洛谷

// https://www.luogu.com.cn/problem/SP1805
#include <iostream>
#include <stack>
using namespace std;
typedef long long LL;
const int N = 1e5 + 10;
int n;
LL h[N];
LL x[N], y[N];
int main()
{
while(cin >> n, n)
{
for(int i = 1; i <= n; i++) cin >> h[i];
// 找左邊,?
stack<int> st;
for(int i = 1; i <= n; i++)
{
// 單調遞增的棧 - 存下標
while(st.size() && h[st.top()] >= h[i]) st.pop();
if(st.size()) x[i] = st.top();
else x[i] = 0;
st.push(i);
}
// 找右邊,?
while(st.size()) st.pop();
for(int i = n; i >= 1; i--)
{while(st.size() && h[st.top()] >= h[i]) st.pop();
if(st.size()) y[i] = st.top();
else y[i] = n + 1;
st.push(i);
}
LL ret = 0;
for(int i = 1; i <= n; i++)
{
ret = max(ret, h[i] * (y[i] - x[i] - 1));
}
cout << ret << endl;
}
return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/80259.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/80259.shtml
英文地址,請注明出處:http://en.pswp.cn/web/80259.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

查看電腦信息的方法-CPU核心數量、線程數量等

1、查看CPU基本信息 step 1: windows下 “winr” 進入CMD step 2: 查看核心數&#xff1a;wmic cpu get NumberofCores 查看線程數&#xff1a;wmic cpu get NumberOfLogicalProcessors 查看CPU名稱&#xff1a;wmic cpu get Name 查看CPU時鐘頻率&#xff1a;wmic cpu get Ma…

令牌桶和漏桶算法使用場景解析

文章目錄 什么時候用令牌桶&#xff0c;什么時候用漏桶算法&#xff1f;&#xff1f;先放結論 兩個算法一眼看懂什么時候選令牌桶&#xff1f;什么時候選漏桶&#xff1f;組合用法&#xff08;90% 的真實系統都會這么干&#xff09;小結記憶 對令牌桶和漏桶組合用法再次詳細敘述…

uniapp|實現獲取手機攝像頭權限,調用相機拍照實現人臉識別相似度對比,拍照保存至相冊,多端兼容(APP/微信小程序)

基于uniapp以及微信小程序實現移動端人臉識別相似度對比,實現攝像頭、相冊權限獲取、相機模塊交互、第三方識別集成等功能,附完整代碼。 目錄 核心功能實現流程攝像頭與相冊權限申請權限拒絕后的引導策略攝像頭調用拍照事件處理人臉識別集成圖片預處理(Base64編碼/壓縮)調用…

OpenCV CUDA 模塊中用于在 GPU 上計算兩個數組對應元素差值的絕對值函數absdiff(

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 void cv::cuda::absdiff 是 OpenCV CUDA 模塊中的一個函數&#xff0c;用于在 GPU 上計算兩個數組對應元素差值的絕對值。 該函數會逐元素計算兩…

Rust 數據結構:HashMap

Rust 數據結構&#xff1a;HashMap Rust 數據結構&#xff1a;HashMap創建一個新的哈希映射HashMap::new()將元組變成哈希表 訪問哈希映射中的值哈希映射和所有權更新哈希映射重寫一個值僅當鍵不存在時才添加鍵和值基于舊值更新值 散列函數 Rust 數據結構&#xff1a;HashMap …

【從設置到上傳的全過程】本地多個hexo博客,怎么設置ssh才不會互相影響

偶然間&#xff0c;想多建一個博客&#xff0c;但電腦已經有一個博客了&#xff0c;怎么設置ssh才不會互相影響呢&#xff1f; 在 Windows 系統上設置多個 Hexo 博客的 SSH 配置&#xff0c;避免互相影響&#xff0c;通常戶就需要為每個博客配置不同的 SSH 密鑰&#xff0c;并…

【時時三省】(C語言基礎)字符數組應用舉例2

山不在高&#xff0c;有仙則名。水不在深&#xff0c;有龍則靈。 ----CSDN 時時三省 例題&#xff1a; 有3個字符串&#xff0c;要求找出其中“最大”者。 解題思路&#xff1a; 可以設一個二維的字符數組str&#xff0c;大小為320&#xff0c;即有3行20列&#xff08;每一…

2025認證杯挑戰賽第二階段B題【 謠言在社交網絡上的傳播 】原創論文講解(含完整python代碼)

大家好呀&#xff0c;從發布賽題一直到現在&#xff0c;總算完成了認證杯數學中國數學建模網絡挑戰賽第二階段B題目謠言在社交網絡上的傳播完整的成品論文。 本論文可以保證原創&#xff0c;保證高質量。絕不是隨便引用一大堆模型和代碼復制粘貼進來完全沒有應用糊弄人的垃圾半…

Qt功能區:Ribbon使用

Ribbon使用 1. Ribbon功能區介紹1.1 樣式 2. 基本功能區設置2.1 安裝動態庫&#xff08;推薦&#xff09;2.2 在MainWindow中使用Ribbon2.3 在QWidget中使用SARibbonBar2.4 創建Category和Pannel2.5 ContextCategory 上下文標簽創建 2.6 ApplicationButton2.7 QuickAccessBar和…

Ubnutu ADB 無法識別設備的解決方法

1. 正確安裝adb 下載地址 2. 檢查 Linux 是否識別設備 lsusb通過上述指令&#xff0c;分別查詢插入、斷開設備的usb設備表&#xff0c;如下所示&#xff1a; # 插入設備 adbc:~$ lsusb Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 001 Device 011:…

C# 實現雪花算法(Snowflake Algorithm)詳解與應用

在現代分布式系統中&#xff0c;生成全局唯一的標識符&#xff08;ID&#xff09;是一個非常重要的問題。隨著微服務架構和分布式系統的普及&#xff0c;傳統的單機數據庫生成 ID 的方式已無法滿足高并發和高可用的需求。為了解決這個問題&#xff0c;Twitter 提出了 雪花算法&…

STM32+ESP8266連接onenet新平臺

若該文為原創文章&#xff0c;轉載請注明原文出處。 阿里云物聯網平臺無法開通了&#xff0c;所以嘗試使用onenet平臺。 一、硬件 1、STM32F103C8T6最?系統板 2、ESP-01S 3、DHT11 二、軟件 1、KEIL5.29 2、Token生成工具 3、app inventor 三、原理 四、平臺搭建 1、注…

深入解析Spring Boot與Redis集成:高效緩存實踐

深入解析Spring Boot與Redis集成&#xff1a;高效緩存實踐 引言 在現代Web應用開發中&#xff0c;緩存技術是提升系統性能的重要手段之一。Redis作為一種高性能的鍵值存儲數據庫&#xff0c;廣泛應用于緩存、會話管理和消息隊列等場景。本文將詳細介紹如何在Spring Boot項目中…

Python自學筆記3 常見運算符

常用運算符 加減法 python的自動數據類型轉換 整形轉為浮點型 實數轉為復數 數字類型不能和浮點數類型相加減 乘除法 數據轉換基本同加減法&#xff0c; 但字符串可以和整數相加減&#xff0c;作用是字符串的自我復制 反斜杠 成員運算符 判斷一個元素是不是一個序列的成員…

[特殊字符]接口測試用例設計指南:全面覆蓋與精準驗證

一、接口測試的核心價值 接口作為系統間通信的橋梁&#xff0c;其穩定性和準確性直接影響業務功能。通過科學設計的測試用例&#xff0c;可以提前暴露接口潛在缺陷&#xff0c;降低上下游系統的耦合風險。本文將系統講解接口測試的用例設計策略&#xff0c;覆蓋查詢類接口與操…

[SpringBoot]Spring MVC(2.0)

緊接上文&#xff0c;這篇我們繼續講剩下的HTTp請求 傳遞JSON數據 簡單來說&#xff1a;JSON就是?種數據格式,有??的格式和語法,使??本表??個對象或數組的信息,因此JSON本質是字符串. 主要負責在不同的語?中數據傳遞和交換 JSON的語法 1. 數據在 鍵值對(Key/Value) …

錨點跳轉跟蹤#

一、html <div ref"computingref"><section id"section1"> </section><section id"section2"> </section><section id"section3"> </section> </div><div class"nav-list&q…

一文了解多模態大模型LLaVA與LLaMA的概念

目錄 一、引言 二、LLaVA與LLaMA的定義 2.1 LLaMA 2.2 LLaVA 2.3 LLaVA-NeXT 的技術突破 三、產生的背景 3.1 LLaMA的背景 3.2 LLaVA的背景 四、與其他競品的對比 4.1 LLaMA的競品 4.2 LLaVA的競品 五、應用場景 5.1 LLaMA的應用場景 5.2 LLaVA的應用場景 六…

【LLM】大模型算力基礎設施——核心硬件GPU/TPU,架構技術NVLink/RDMA,性能指標FP64/FLOPS(NVIDIA Tesla型號表)

【LLM】大模型算力基礎設施——核心硬件GPU/TPU&#xff0c;架構技術NVLink/RDMA&#xff0c;性能指標FP64/FLOPS&#xff08;NVIDIA Tesla型號表&#xff09; 文章目錄 1、核心硬件GPU/TPU&#xff0c;NVIDIA Tesla2、集群架構設計 NVLink / RDMA / Alluxio3、性能關鍵指標&am…

spark的Standalone模式介紹

Apache Spark 的 Standalone 模式是其自帶的集群管理模式&#xff0c;無需依賴外部資源管理器&#xff08;如 YARN 或 Mesos&#xff09;&#xff0c;可快速部署和運行 Spark 集群。以下是對 Standalone 模式的詳細介紹&#xff1a; 1. 核心組件 Master 節點 集群的主控制器…