滑动窗口/单调队列
题目链接:P1886 滑动窗口 /【模板】单调队列 - 洛谷
题目的意思是通过窗口的不断滑动,输出此时的最大值和最小值
思路:
为了使思路更加清楚,使用一个双端队列来模拟这个过程,以最小值举例:中心是维护一个单调递增的窗口,当有新的元素时,首先从前面剔除所有之前的元素(此时不在窗口里),然后从后边剔除所有比它大的元素,输出此时的队头(最小值)。最大值与之类似。
代码:
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e6+5;
int a[N];
void solve()
{deque<int> q;int n,k;cin >> n >> k;for(int i=1; i<=n; i++) cin >> a[i];for(int i=1; i<=n; i++){while(!q.empty()&&i-k>=q.front())//去掉窗口之前的元素q.pop_front();while(!q.empty()&&a[q.back()]>a[i])//将大于的全部去掉,维护单调递增q.pop_back();q.push_back(i);//将值存进去if(i>=k)//输出此时的最小值cout << a[q.front()] << ' ';}cout << endl;q.clear();//记得清空队列for(int i=1; i<=n; i++)//与最小值同理{while(!q.empty()&&i-k>=q.front())q.pop_front();while(!q.empty()&&a[q.back()]<a[i])q.pop_back();q.push_back(i);if(i>=k)cout << a[q.front()] << ' ';}
}
signed main()
{ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int t=1;
// cin >> t;while(t--) solve();
}