洛谷-P1886 【模板】单调队列 / 滑动窗口

题目描述

有一个长为 n 的序列 a,以及一个大小为 k 的窗口。现在这个窗口从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最小值和最大值。

例如,对于序列 [1,3,−1,−3,5,3,6,7] 以及 k=3,有如下过程:

输入格式

输入一共有两行,第一行有两个正整数 n,k;

第二行有 n 个整数,表示序列 a。

输出格式

输出共两行,第一行为每次窗口滑动的最小值;

第二行为每次窗口滑动的最大值。

输入输出样例

输入 #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% 的数据,1≤n≤105;

对于 100% 的数据,1≤k≤n≤106,ai​∈[−231,231)。

题解

cpp 复制代码
#include <bits/stdc++.h>
// #include<iostream>
// #include<iomanip>
// #include<vector>
// #include<queue>
// #include<cstring>
// #include <algorithm>
// #define int long long
#define rep(i, l, r) for (int i = l; i <= r; i++)
using namespace std;
#define pii pair<int, int>
#define endl '\n'
const int M = 1e6 + 7;
const int N = 1e8 + 7;

int a[M],b[M];
int q[M],hh=0,tt=-1;

int main()
{
  std::ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
int n,k;
cin>>n>>k;
rep(i,1,n)cin>>a[i];

rep(i,1,n)
{
  if(hh<=tt&&q[hh]<i-k+1)hh++;
  while(hh<=tt&&a[i]<=a[q[tt]])tt--;
  q[++tt]=i;
   if(i>=k)b[i]=a[q[hh]];
}
rep(i,k,n)cout<<b[i]<<' ';
cout<<endl;
hh=0,tt=-1;
rep(i,1,n)
{
  if(hh<=tt&&q[hh]<i-k+1)hh++;
  while(hh<=tt&&a[i]>=a[q[tt]])tt--;
  q[++tt]=i;
   if(i>=k)b[i]=a[q[hh]];
}
rep(i,k,n)cout<<b[i]<<' ';
cout<<endl;

      return 0;
}
相关推荐
PPPPPaPeR.12 小时前
光学算法实战:深度解析镜片厚度对前后表面折射/反射的影响(纯Python实现)
开发语言·python·数码相机·算法
看我干嘛!12 小时前
python第五次作业
算法
历程里程碑12 小时前
Linux 库
java·linux·运维·服务器·数据结构·c++·算法
Sheep Shaun12 小时前
如何让一个进程诞生、工作、终止并等待回收?——探索Linux进程控制与Shell的诞生
linux·服务器·数据结构·c++·算法·shell·进程控制
Pluchon12 小时前
硅基计划4.0 简单模拟实现AVL树&红黑树
java·数据结构·算法
生锈的键盘12 小时前
推荐算法实践:交叉特征的理解
算法
小龙报13 小时前
【51单片机】从 0 到 1 玩转 51 蜂鸣器:分清有源无源,轻松驱动它奏响新年旋律
c语言·数据结构·c++·stm32·单片机·嵌入式硬件·51单片机
乌萨奇也要立志学C++13 小时前
【洛谷】BFS 求解最短路:从马的遍历到迷宫问题的实战解析
算法·宽度优先
石去皿13 小时前
【嵌入式就业6】计算机组成原理与操作系统核心机制:夯实底层基础
c++·面试·嵌入式