P1886 滑动窗口 /【模板】单调队列
//60分
#include<bits/stdc++.h>
using namespace std;
vector <int> Maxv,Minv;
struct Maxnode
{
int val;
int i;
bool operator <(const Maxnode &n)const
{
if (val>n.val)
return true;
else
return i<n.i;
}
};
set <Maxnode> Maxset;
int main()
{
int n,k;
Maxnode Mx;
set<Maxnode>::iterator Mxit,Miit;
scanf("%d %d",&n,&k);
for (int i=1;i<=k;i++)
{
int x;
scanf("%d",&x);
Mx.val=x;
Mx.i=i;
Maxset.insert(Mx);
}
for (int i=k+1;i<=n;i++)
{
int x;
Mxit=Maxset.begin();
while(i-(Mxit->i)>k)
{
Maxset.erase(Mxit);
Mxit=Maxset.begin();
}
Maxv.push_back(Mxit->val);
Miit=Maxset.end();
Miit--;
while(i-(Miit->i)>k)
{
Maxset.erase(Miit);
Miit=Maxset.end();
Miit--;
}
Minv.push_back(Miit->val);
scanf("%d",&x);
Mx.val=x;
Mx.i=i;
Maxset.insert(Mx);
}
Mxit=Maxset.begin();
while(n+1-(Mxit->i)>k)
{
Maxset.erase(Mxit);
Mxit=Maxset.begin();
}
Maxv.push_back(Mxit->val);
Miit=Maxset.end();
Miit--;
while(n+1-(Miit->i)>k)
{
Maxset.erase(Miit);
Miit=Maxset.end();
Miit--;
}
Minv.push_back(Miit->val);
for (int i=0;i<Minv.size();i++)
{
printf("%d ",Minv[i]);
}
printf("\n");
for (int i=0;i<Maxv.size();i++)
{
printf("%d ",Maxv[i]);
}
printf("\n");
return 0;
}