洛谷P3032扫描–题解
题目的意思呢就是一个长度为k的滑动窗口,在一个长度为n的数组中从头滑到尾,输出每一次滑动窗口里的最大值。
看到题解区很多dalao都用的是队列、优先队列什么的,连线段树都出来了,这里鶸推荐一个更方便的,叫map
思路呢就是利用map的自动排序和erase,在一开始的时候读入k个数并输出mp.rbegin()->first
之后的每一次滑动都可以减掉a[i-k]并且判断mp[a[i-k]]是不是为0,如果为0,就erase,不再计算。输出自然是mp.rbegin()->first
那么。。。喜闻乐见,上代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2e6+10;
const int mod=1e9+7;
const int inf=INT_MAX;
int a[maxn];
int main()
{
ios::sync_with_stdio(false);
int n, k;
cin>>n>>k;
map<int, int> mp;
for(int i=0; i<n; i++) cin>>a[i]; //初始读入
for(int i=0; i<k; i++) mp[a[i]]++; //初始窗口
cout<<mp.rbegin()->first;
for(int i=k; i<n; i++){
mp[a[i]]++;
if (--mp[a[i-k]]==0) mp.erase(a[i-k]); //==0就erase
cout<<endl<<mp.rbegin()->first;
}
return 0;
}