社区讨论
P1886 AC但有个地方有点不太懂(求助)
P1886【模板】单调队列 / 滑动窗口参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @lo1m2d28
- 此快照首次捕获于
- 2023/10/22 23:15 2 年前
- 此快照最后确认于
- 2023/11/03 00:00 2 年前
CPP
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<bits/stdc++.h>
using namespace std;
#define itn int
#define ll long long
#define ull unsigned long long
#define ff() for(int i=1;i<=n;i++)
const int maxn=91451451;
deque<int> q;
int n , m , num;
int a[maxn];
int b[maxn];
inline int read(){//神奇的读优
int h_=1,d_=0;char t_=getchar();
while(t_<'0' || t_>'9'){if(t_=='-')h_=-1;t_=getchar();}
while(t_>='0' && t_<='9'){d_=d_*10+t_-'0';t_=getchar();}return h_*d_;
}
void print(int x_){//快输
if(x_<0){
putchar('-'),x_=-x_;
}
if(x_>9){
print(x_/10);
}
putchar(x_%10+'0');
return ;
}
signed main(){
n = read();
m = read();
ff()
{
cin >> a[i];
}
for (int i = 1;i <= n; i++)//min
{
while (!q.empty() && a[q.back()] > a[i])
{
q.pop_back();
}
q.push_back(i);
if (i >= m )
{
while(!q.empty()&&q.front()<=i-m) q.pop_front();
cout<<a[q.front()]<< ' ';
}
}
cout<<'\n';
while(!q.empty())q.pop_front();
for (int i = 1;i <= n; i++)//max
{
while (!q.empty() && a[q.back()] < a[i])
{
q.pop_back();
}
q.push_back(i);
if (i >= m )
{
while(!q.empty()&&q.front()<=i-m) q.pop_front();
cout<<a[q.front()]<<' ';
}
}
cout<<'\n';
return 0;
}
那几个while循环都有点懵逼,请大佬解答一下是什么个原理
万分感谢~~~
回复
共 2 条回复,欢迎继续交流。
正在加载回复...