一个双端队列裸题,和[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;
}