P1880
滑动窗口 /【模板】单调队列
题目描述
有一个长为
例如,对于序列
输入格式
输入一共有两行,第一行有两个正整数
第二行
输出格式
输出共两行,第一行为每次窗口滑动的最小值
第二行为每次窗口滑动的最大值
样例 #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
提示
【数据范围】
对于
对于
#include<bits/stdc++.h>
using namespace std;
int x;
struct sd
{
int num,val; //存储编号和大小
};
deque<sd> que;
deque<sd> que1;
int add[3][1000005]; //用以存储答案的----见代码
int main()
{
int n,m,k,cnt=1;
cin>>n>>k;
sd rr;
for(int i=1;i<=n;i++)
{
scanf("%d",&x); //输入
rr.num=i; rr.val=x; //赋值
while(!que.empty()&&x>=que.back().val)
que.pop_back(); //单调队列的操作,以保证单调
while(!que1.empty()&&x<=que1.back().val)
que1.pop_back();
que.push_back(rr); //压入队列
que1.push_back(rr);//同上
while(i-k>=que.front().num) //T掉不在范围内的
que.pop_front();
while(i-k>=que1.front().num)
que1.pop_front(); //同上
if(i>=k)
{
add[0][cnt]=que.front().val;
add[1][cnt]=que1.front().val;
cnt++;
} //存答案
}
for(int i=1;i<cnt;i++)
printf("%d ",add[1][i]);
printf("\n");
for(int i=1;i<cnt;i++)
printf("%d ",add[0][i]); //输出
return 0;
}
1 d[i]//:返回d中下标为I的元素的引用。
2 d.front()//:返回的一个元素的引用。
3 d.back()//:返回最后一个元素的引用。
4 d.pop_back()//:删除尾部的元素。不返回值。
5 d.pop_front()//:删除头部元素。不返回值。
6 d.push_back(e)//:在队尾添加一个元素e。
7 d.push_front(e)//:在对头添加一个元素e。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理