P1886 滑動窗口 /【模板】單調隊列【題解】

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

題目描述

有一個長為 nnn 的序列 aaa,以及一個大小為 kkk 的窗口。現在這個窗口從左邊開始向右滑動,每次滑動一個單位,求出每次滑動后窗口中的最小值和最大值。

例如,對于序列 [1,3,?1,?3,5,3,6,7][1,3,-1,-3,5,3,6,7][1,3,?1,?3,5,3,6,7] 以及 k=3k = 3k=3,有如下過程:

窗口位置最小值最大值[1???3??-1]?-3???5???3???6???7??13?1??[3??-1??-3]??5???3???6???7??33?1???3?[-1??-3???5]??3???6???7??35?1???3??-1?[-3???5???3]??6???7??35?1???3??-1??-3??[5???3???6]??7?36?1???3??-1??-3???5??[3???6???7]37\def\arraystretch{1.2} \begin{array}{|c|c|c|}\hline \textsf{窗口位置} & \textsf{最小值} & \textsf{最大值} \\ \hline \verb![1 3 -1] -3 5 3 6 7 ! & -1 & 3 \\ \hline \verb! 1 [3 -1 -3] 5 3 6 7 ! & -3 & 3 \\ \hline \verb! 1 3 [-1 -3 5] 3 6 7 ! & -3 & 5 \\ \hline \verb! 1 3 -1 [-3 5 3] 6 7 ! & -3 & 5 \\ \hline \verb! 1 3 -1 -3 [5 3 6] 7 ! & 3 & 6 \\ \hline \verb! 1 3 -1 -3 5 [3 6 7]! & 3 & 7 \\ \hline \end{array} 窗口位置[1???3??-1]?-3???5???3???6???7??1??[3??-1??-3]??5???3???6???7??1???3?[-1??-3???5]??3???6???7??1???3??-1?[-3???5???3]??6???7??1???3??-1??-3??[5???3???6]??7??1???3??-1??-3???5??[3???6???7]?最小值?1?3?3?333?最大值335567??

輸入格式

輸入一共有兩行,第一行有兩個正整數 n,kn,kn,k
第二行有 nnn 個整數,表示序列 aaa

輸出格式

輸出共兩行,第一行為每次窗口滑動的最小值;
第二行為每次窗口滑動的最大值。

輸入輸出樣例 #1

輸入 #1

8 3
1 3 -1 -3 5 3 6 7

輸出 #1

-1 -3 -3 -3 3 3
3 3 5 5 6 7

說明/提示

【數據范圍】
對于 50%50\%50% 的數據,1≤n≤1051 \le n \le 10^51n105
對于 100%100\%100% 的數據,1≤k≤n≤1061\le k \le n \le 10^61kn106ai∈[?231,231)a_i \in [-2^{31},2^{31})ai?[?231,231)

解析:

無法暴力T_T

暴力枚舉的方式是進行 n?kn-kn?k 次循環,每次查找長度為k的區間的最值。這樣的算法的時間復雜度為 O(n2)O(n^2)O(n2) ,無法通過本題。

單調隊列

可以建立一個隊列來維護這些數據。這個隊列有一些特點就是:隊列中的數都是原序列 aaa 中數字 aia_iai? 的下標 iii ,隊列隨著窗口滑動而更新,保證隊列中存的下標都處于當前窗口中。并且保持隊首為窗口中最大數的下標。

如何實現

那么如何實現呢?假設我們找每個區間的最小值:將原序列中每個數 aia_iai? 作為一個元素依次進行如下操作:如果隊列為空,直接將當前元素下標 iii 入隊。當隊列不為空時,在加入新元素之前,檢查隊尾數 fff 代表的原序列數 afa_faf? 是否小于 aia_iai? ,若小于,則將隊尾數刪除,多次判斷,直到隊尾數 fff 代表的原序列數 afa_faf? 大于 aia_iai? 或隊列為空。然后將 iii 放入隊尾。再檢查隊首數 sss ,若 sss 已在我們的區間外,則將隊首刪去。則每段區間的最大值就是操作完的隊列的隊首數 sss 表示的原序列數 asa_sas?

正確性驗證

那么為何這樣實現是正確的呢?因為我們的操作都保證了隊列中的數 xxx 表示的 axa_xax? 一定是單調遞減的,且 asa_sas? 一定是最大的,當 asa_sas? 不在序列后,隊列中第二個數 ttt ,一定滿足 t>st>st>s。雖然 tttsss 沒有必然的數量關系,但是 a(s+1)→(t?1)<at<asa_{(s+1)→(t-1)}<a_t<a_sa(s+1)(t?1)?<at?<as?,也就是說只要 ata_tat? 還在序列,ata_tat? 一定就是最大值!

幾個注意點

但是注意最小值并不是每次操作之后隊尾 fff 表示的數 afa_faf? ,因為在之前的操作中可能存在最小值在隊尾,而新判斷的元素 ai>afa_i>a_fai?>af? 導致 afa_faf? 被出隊,iii 入隊,而 aia_iai? 并不是區間最小值。所以與求最大值相似,求最小值要條件相反地建一個單調隊列。

由于開始時 i<ki<ki<k ,隊列的變化無法表達整個區間,等到 i≥ki \geq kik 了,才可以表示第 i?k+1i-k+1i?k+1 個區間的最值。

代碼實現

由于兩端都有出隊操作,STLSTLSTL 中的普通隊列 queuequeuequeue 已經無法滿足。所以用 STLSTLSTL 中另一個神奇的雙端隊列 dequedequedeque

deque相關

deque介紹:

首尾都可插入和刪除的隊列為雙端隊列。

deque聲明:

deque<元素類型> 名稱; 例: deque dq;

deque在本題中可能用到的函數:

  • 隊列名.push_back(x); 把x插入隊尾后
  • 隊列名.push_front(x); 把x插到隊首
  • 隊列名.back(); 返回隊尾元素
  • 隊列名.front(); 返回隊首元素
  • 隊列名.pop_back(); 刪除隊尾元素
  • 隊列名.pop_front(); 刪除隊首元素
  • 隊列名.empty(); 判斷雙端隊列是否空
  • 隊列名.clear(); 清空雙端隊列

CoDe

代碼與解析基本相符,注釋略。

#include<bits/stdc++.h>
using namespace std;
int n,k;
int a[1000005];
int mn[1000005];
int mx[1000005];
deque<int>dq;
int main(){cin>>n>>k;for(int i=1;i<=n;i++){cin>>a[i];}for(int i=1;i<=n;i++){while(!dq.empty()&&i-dq.front()+1>k) dq.pop_front();while(!dq.empty()&&a[dq.back()]>a[i]) dq.pop_back();dq.push_back(i);if(i>=k){mn[i]=a[dq.front()];}}for(int i=k;i<=n;i++){cout<<mn[i]<<' ';}cout<<endl;dq.clear();for(int i=1;i<=n;i++){while(!dq.empty()&&i-dq.front()+1>k) dq.pop_front();while(!dq.empty()&&a[dq.back()]<a[i]) dq.pop_back();dq.push_back(i);if(i>=k){mx[i]=a[dq.front()];}}for(int i=k;i<=n;i++){cout<<mx[i]<<' ';}return 0;
}

當然你用自己手寫的雙向隊列來實現操作也可以,代碼就不放了。我看其他大部分人都是用手寫雙向隊列來實現操作的,代碼很好找。

單點隊列一般不作為單獨題目出現,而是作為動態規劃的一種優化出現在一些較難的動態規劃題中

求贊QAQ

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

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

相關文章

河南萌新聯賽2025第(五)場:信息工程大學補題

文章目錄[TOC](文章目錄)前言A.宇宙終極能量調和與多維時空穩定性驗證下的基礎算術可行性研究B.中位數C.中位數1F.中位數4G.簡單題H.簡單題I.Re:從零開始的近世代數復習&#xff08;easy&#xff09;K.狂飆追擊L.防k題前言 這次萌新聯賽考到了很多數學知識 A.宇宙終極能量調和…

SuperMap GIS基礎產品FAQ集錦(20250804)

一、SuperMap iServer 問題1&#xff1a;iServer的名稱和logo怎么自定義&#xff1f; 11.3.0 【解決辦法】參考&#xff1a;https://blog.csdn.net/supermapsupport/article/details/144744640 問題2&#xff1a;iServer 刷新工作空間&#xff0c;當數據庫是 PostGIS 時&#x…

AWS CloudFormation批量刪除指南:清理Clickstream Analytics堆棧

概述 在AWS環境管理中,經常會遇到需要批量刪除CloudFormation堆棧的情況。本文記錄了一次完整的Clickstream Analytics堆棧清理過程,包括遇到的問題和解決方案,希望能為其他開發者提供參考。 背景 我們的AWS賬戶中部署了多個Clickstream Analytics解決方案的CloudFormati…

redis中分布式鎖的應用

我們之前講了秒殺模塊的實現&#xff0c;使用了sychronized互斥鎖&#xff0c;但是在集群模式下因為不同服務器有不同jvm&#xff0c;所以synchronized互斥鎖失效了。 redis實現秒殺超賣問題的解決方案&#xff1a;(僅限于單體項目)-CSDN博客 這時就要找到一個多臺服務器都能…

【科研繪圖系列】R語言繪制微生物豐度和基因表達值的相關性網絡圖

文章目錄 介紹 加載R包 數據下載 導入數據 數據預處理 畫圖 系統信息 參考 介紹 【科研繪圖系列】R語言繪制微生物豐度和基因表達值的相關性網絡圖 加載R包 library(tidyverse) library(ggsignif) library(RColorBrewer) library(dplyr) library(reshape2) library(grid

Pycharm現有conda環境有對應env,但是添加后沒反應

一、系統環境 二、異常現象 Pycharm現有conda環境有對應env&#xff1a; anaconda3的envs下也確實存在這個環境&#xff1a; 但是添加后沒反應&#xff08;點擊確認后&#xff0c;yolov7環境沒有出現在列表中&#xff09;&#xff1a; 但是我之前在別的機子添加是沒問題的。 …

Git常用指令大全:從入門到精通

Git 的常用指令&#xff0c;分為基礎操作、分支管理、遠程協作、撤銷操作和高級功能五個部分&#xff0c;并附上實用示例&#xff1a;一、基礎操作&#xff08;必會&#xff09;初始化倉庫 git init # 在當前目錄創建新倉庫克隆遠程倉庫 git clone https://github.com/user/rep…

Redis (REmote DIctionary Server) 高性能數據庫

Redis {REmote DIctionary Server} 高性能數據庫1. What is Redis?1.1. 基于內存的數據存儲2. Install Redis on Linux3. Starting and stopping Redis in the background3.1. systemctl3.2. service 4. Connect to Redis5. 退出 Redis 的命令行界面 (redis-cli)6. redis-serv…

MySQL中的DML(二)

DML(Data Manipulation Language) : 數據庫操作語言&#xff0c;對數據庫中表的數據進行增刪改操作。 創建student表&#xff1a; CREATE DATABASE test; use test; CREATE TABLE student (id int,name varchar(255),address varchar(255),city varchar(255) );INSERT INTO stu…

linux 主機驅動(SPI)與外設驅動分離的設計思想

一、 主機驅動與外設驅動分離Linux中的SPI、I2c、USB等子系統都利用了典型的把主機驅動和外設驅動分離的想法&#xff0c;讓主機端負責產生總線上的傳輸波形&#xff0c;而外設端只是通過標準的API來讓主機端以適當的波形訪問自身。因此這里涉及了4個軟件模塊&#xff1…

如何生成.patch?

文章目錄 ??方法 1:使用 `git format-patch`(推薦)? ??步驟?? ?方法 2:使用 `diff`命令(適用于非 Git 項目)? ??方法 3:使用 `git diff`(生成未提交的變更)? ?方法 4:使用 `quilt`(適用于大量補丁管理) ?如何提交補丁給上游項目?? ?總結?? 在 L…

【計算機網絡 | 第6篇】計算機體系結構與參考模型

文章目錄計算機體系結構與參考模型分層思想&#x1f342;常見的3種模型&#xff08;網絡體系結構&#xff09;&#x1f426;?&#x1f525;TCP/IP體系結構各層包含的主要協議&#x1f95d;每層所解決的主要問題&#x1f914;層次間的交互規則&#x1f95d;實體與對等實體協議服…

Autoware Universe 感知模塊詳解 | 第一節 感性認識多源傳感器標定

傳感器與感知模塊 在基于規則的自動駕駛系統中&#xff0c;感知模塊&#xff0c;承擔著理解車體周圍環境信息的重要職責。它通過融合多種傳感器數據&#xff0c;與定位模塊共同為規劃與控制模塊提供準確、系統化的輸入信息。正如人可以通過眼睛觀察周圍的環境&#xff08;盲人也…

docker搭建java運行環境(java或者springboot)

目錄1. 創建測試代碼2. 編譯打包3. 代碼環境運行使用普通運行方式使用docker掛載項目&#xff08;長期運行&#xff09;1. 創建 Dockerfile2. 構建并后臺運行使用docker swram實現零停機更新&#xff08;推薦&#xff09;1. 初始化swarm2. 創建 Dockerfile3. 使用Dockerfile 構…

哈希表特性與unordered_map/unordered_set實現分析

目錄 一、哈希表核心特性總結 1.開放地址法 2.鏈地址法 二、unordered_map/unordered_set實現要點分析 1. 哈希表核心實現(HashTable2.h) (1) 哈希函數處理 (2) 鏈地址法實現 (3) 迭代器設計 (4) hashtable設計 2. unordered_map實現要點 3. unordered_map實現要點 一…

生產環境sudo配置詳細指南

目錄 1. 語法格式 2. 配置示例 3. 使用 /etc/sudoers.d/ 目錄管理&#xff08;推薦&#xff09; 4. 基礎配置&#xff1a;用戶權限管理 4.1 ??添加用戶到sudo組 ??4.2 驗證用戶組信息 5. sudo日志配置 5.1 修改sudoers配置文件 5.2 創建日志目錄與權限設置 6. Su…

CSS動態視口單位:徹底解決移動端適配頑疾,告別布局跳動

你是否曾被這些問題困擾&#xff1a; 移動端頁面滾動時&#xff0c;地址欄收縮導致頁面高度突變&#xff0c;元素錯位&#xff1f;100vh在移動設備上實際高度超出可視區域&#xff1f;全屏彈窗底部總被瀏覽器UI遮擋&#xff1f; 這些痛點背后都是傳統視口單位的局限——無法響應…

【P27 4-8】OpenCV Python——Mat類、深拷貝(clone、copyTo、copy)、淺拷貝,原理講解與示例代碼

P27 4-8 1 Mat結構體2 深拷貝VS淺拷貝3 代碼示例1 Mat結構體 2 深拷貝VS淺拷貝 只拷貝了頭部&#xff0c;header&#xff0c;&#xff0c;但是data部分是共用的&#xff0c;速度非常快&#xff1b; 缺點&#xff0c;任意一個修改&#xff0c;另一個data跟著變&#xff0c;這就是…

容器運行時支持GPU,并使用1panel安裝ollama

前言 安裝Docker請看之前博文&#xff1a;Docker實戰中1panel方式安裝Docker。 安裝 NVIDIA 容器工具包 https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html 安裝 先決條件 閱讀有關平臺支持的部分。為您的 Linux 發行版安裝…

高并發內存池 性能瓶頸分析與基數樹優化(9)

文章目錄前言一、性能瓶頸分析操作步驟及其環境配置分析性能瓶頸二、基數樹優化單層基數樹二層基數樹三層基數樹三、使用基數樹來優化代碼總結前言 到了最后一篇嘍&#xff0c;嘻嘻&#xff01; ??終于是要告一段落了&#xff0c;接下來我們將學什么呢&#xff0c;再說吧&…