“强烈谴责那些半夜内卷的人”
戳我看原题
题目大意
一个含有 n 项的数列,求出每一项前的 m 个数到它这个区间内的最小值。若前面的数不足 m 项则从第 1 个数开始,若前面没有数则输出 0。
思路
滑动窗口+单调队列,类似于单调栈。可以先看看单调栈<点我>。
使用单调队列储存下标,保留标准是当前元素大于队列比较元素,不断进行更新维护。
代码
点击查看代码
#include <bits/stdc++.h>
using namespace std;
using ll = long long;int main() {ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);int n,m;cin>>n>>m;vector<ll>a(n);deque<long long>x;for(int i=0;i<n;i++){cin>>a[i];}cout<<0<<endl;for(int i=1;i<n;i++){while(!x.empty()&&a[x.back()]>a[i-1]){x.pop_back();}while(!x.empty()&&x.front()<i-m)x.pop_front();x.push_back(i-1);cout<<a[x.front()]<<endl;}return 0;
}
有关单调双端队列
本题我使用的是双端队列,当然,也可以使用数组代替。有关双端队列的用法请参考以下:deque
有关其他
晚安,困了。
不过最近玩樱之诗时看到了一句有意思的话:“长夜伴浪破晓梦,梦晓浪破伴夜长”,原文为“なかきよの とおのねふりの みなめさめ なみのりふねの おとのよきかな”,有些令人动容。