poj 2823
单调队列的经典题
代码:
#include<iostream>
#include<fstream>
#include<queue>
using namespace std;
#define MAX 1000000
int a[1000001];
int minn[1000001];
int maxx[1000001];
int n,m,f1,r1,f2,r2;
void read(){
// ifstream cin("in.txt");
int i,j,k;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
for(i=1;i<=m;i++)
{
while(f1!=r1&&minn[r1]>a[i])
r1=(r1-1+MAX)%MAX;
r1=(r1+1)%MAX;
minn[r1]=a[i];
while(f2!=r2&&maxx[r2]<a[i])
r2=(r2-1+MAX)%MAX;
r2=(r2+1)%MAX;
maxx[r2]=a[i];
}
for(i=m;i<n;i++)
{
cout<<minn[(f1+1)%MAX]<<' ';
if(a[i-m+1]==minn[(f1+1)%MAX])
f1=(f1+1)%MAX;
while(f1!=r1&&minn[r1]>a[i+1])
r1=(r1-1+MAX)%MAX;
r1=(r1+1)%MAX;
minn[r1]=a[i+1];
}
cout<<minn[(f1+1)%MAX]<<endl;
for(i=m;i<n;i++)
{
cout<<maxx[(f2+1)%MAX]<<' ';
if(a[i-m+1]==maxx[(f2+1)%MAX])
f2=(f2+1)%MAX;
while(f2!=r2&&maxx[r2]<a[i+1])
r2=(r2-1+MAX)%MAX;
r2=(r2+1)%MAX;
maxx[r2]=a[i+1];
}
cout<<maxx[(f2+1)%MAX]<<endl;
}
int main(){
read();
return 0;
}
浙公网安备 33010602011771号