POJ 2823(单调队列)
题意
给出一个n个数的序列和区间长度k,让你输出每个长度为k区间内的最大值和最小值,顺序是从左往右。
解题思路
单调队列裸题。用G++提交就TLE,改成C++就过了。
#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
const int maxn = 1e6+100;
int arr[maxn],que[maxn],maxx[maxn],minn[maxn],n,k;
void getmax()
{
int rear=0,head=0;
for(int i=1; i<=n; i++)
{
while(rear>head&&arr[que[rear-1]]<=arr[i]) rear--;
que[rear++]=i;
if(i<k) continue;
while(que[head]<i-k+1) head++;
maxx[i]=arr[que[head]];
}
}
void getmin()
{
int head=0,rear=0;
for(int i=1; i<=n; i++)
{
while(rear>head&&arr[que[rear-1]]>=arr[i]) rear--;
que[rear++]=i;
if(i<k) continue;
while(que[head]<i-k+1) head++;
minn[i]=arr[que[head]];
}
}
int main()
{
#ifdef DEBUG
freopen("in.txt","r",stdin);
#endif
scanf("%d%d",&n,&k);
for(int i=1; i<=n; i++) scanf("%d",&arr[i]);
getmax();
getmin();
for(int i=k; i<=n; i++) printf("%s%d",i==k?"":" ",minn[i]);
printf("\n");
for(int i=k; i<=n; i++) printf("%s%d",i==k?"":" ",maxx[i]);
printf("\n");
return 0;
}