P2032 扫描 题解

最后更新于 2025-08-03 11:54:15
作者
分类 题解

思路

说实话,直接模拟过程,剩下的全交给 multiset

每次向后挪一个位置,弹出上一个头结点。multiset 会自动排序,输出区间中的第 $1$ 个数,再换行。反复循环,模拟右移的过程,直到 $i+k=n$ 为止。

AC Code

#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;
}