说实话,直接模拟过程,剩下的全交给 multiset。
每次向后挪一个位置,弹出上一个头结点。multiset 会自动排序,输出区间中的第 $1$ 个数,再换行。反复循环,模拟右移的过程,直到 $i+k=n$ 为止。
#include<bits/stdc++.h>
#define int unsigned long long
using namespace std;
int n,k;
multiset<int>tis;
vector<int>a;
signed main()
{
cin>>n>>k;
a.reserve(n+10);//预分配 n+10 的空间
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int i=1;i<=k;i++)//插入前 k 个数
{
tis.insert(a[i]);
}
cout<<*tis.rbegin()<<"\n";//先输出第 1 轮
for(int i=k+1;i<=n;i++)//模拟遮盖过程
{
tis.insert(a[i]);//插入新元素
tis.erase(tis.find(a[i-k]));//删除过期元素
cout<<*tis.rbegin()<<"\n";//输出最大值
}
return 0;
}