社区讨论

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 条回复,欢迎继续交流。

正在加载回复...