一个双端队列裸题,和[LGOJ]窗口滑动几乎一模一样~
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1000005;
int n,k,tot;
int a[maxn],ans[maxn];
struct node
{
int val,pos;
};
deque <node> maxq;
deque <node> minq;
inline int read()
{
int s=0,f=1;
char c=getchar();
while (c<'0'||c>'9')
{
if (c=='-')
{
f=-1;
}
c=getchar();
}
while (c>='0'&&c<='9')
{
s=s*10+c-48;
c=getchar();
}
return s*f;
}
void find_max()
{
for (int i=1;i<=n;i++)
{
while (!maxq.empty()&&maxq.back().val<=a[i])
{
maxq.pop_back();
}
node cur={a[i],i};
maxq.push_back(cur);
if (maxq.front().pos+k-1<i)
{
maxq.pop_front();
}
if (i>=k)
{
tot++;
ans[tot]=maxq.front().val;
}
}
}
int main()
{
k=read();
int cnt=1;
while (~scanf("%d",&n)&&n!=-1)
{
a[cnt]=n;
cnt++;
}
n=cnt;
find_max();
for (int i=1;i<=tot-1;i++)
{
cout<<ans[i]<<endl;
}
return 0;
}
本文介绍了一种使用双端队列解决滑动窗口最大值问题的算法。通过不断比较并更新队列中的元素,可以高效地找到每个窗口的最大值,适用于处理大量数据的实时分析。

被折叠的 条评论
为什么被折叠?



