标签:单调队列
| Time Limit: 12000MS | Memory Limit: 65536K | |
| Total Submissions: 42278 | Accepted: 12479 | |
| Case Time Limit: 5000MS | ||
Description
| Window position | Minimum value | Maximum value |
|---|---|---|
| [1 3 -1] -3 5 3 6 7 | -1 | 3 |
| 1 [3 -1 -3] 5 3 6 7 | -3 | 3 |
| 1 3 [-1 -3 5] 3 6 7 | -3 | 5 |
| 1 3 -1 [-3 5 3] 6 7 | -3 | 5 |
| 1 3 -1 -3 [5 3 6] 7 | 3 | 6 |
| 1 3 -1 -3 5 [3 6 7] | 3 | 7 |
Your task is to determine the maximum and minimum values in the sliding window at each position.
Input
Output
Sample Input
8 3 1 3 -1 -3 5 3 6 7
Sample Output
-1 -3 -3 -3 3 3 3 3 5 5 6 7
Source
题意:给一个序列,求长度为k的框中最大最小的,
思路:单调队列,维护长度为k的框中的最大,然后再来一次单调队列维护最小的
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<set>
#include<map>
#define L(x) (x<<1)
#define R(x) (x<<1|1)
#define MID(x,y) ((x+y)>>1)
#define eps 1e-8
typedef __int64 ll;
#define fre(i,a,b) for(i = a; i < b; i++)
#define free(i,a,b) for(i = a; i > =b;i--)
#define mem(t, v) memset ((t) , v, sizeof(t))
#define ssf(n) scanf("%s", n)
#define sf(n) scanf("%d", &n)
#define sff(a,b) scanf("%d %d", &a, &b)
#define sfff(a,b,c) scanf("%d %d %d", &a, &b, &c)
#define pf printf
#define bug pf("Hi\n")
using namespace std;
#define INF 0x3f3f3f3f
#define N 1000005
int a[N],que[N*2];
int tail,head;
int mi[N],ma[N];
int le,ri;
int n,k;
inline void miinque(int i)
{
while(head<tail&&a[i]<=a[que[tail-1]])
tail--;
que[tail++]=i;
}
inline void mainque(int i)
{
while(head<tail&&a[i]>=a[que[tail-1]])
tail--;
que[tail++]=i;
}
inline void outque(int i)
{
if(i-k>=que[head]) head++;
}
int main()
{
while(~sff(n,k))
{
int i;
fre(i,1,n+1)
sf(a[i]);
head=tail=0;
le=ri=0;
fre(i,1,k)
{
miinque(i);
}
fre(i,k,n+1)
{
miinque(i);
outque(i);
mi[le++]=a[que[head]];
}
head=tail=0;
fre(i,1,k)
{
mainque(i);
}
fre(i,k,n+1)
{
mainque(i);
outque(i);
ma[ri++]=a[que[head]];
}
fre(i,0,le)
{
if(i) pf(" ");
pf("%d",mi[i]);
}
pf("\n");
fre(i,0,ri)
{
if(i) pf(" ");
pf("%d",ma[i]);
}
pf("\n");
}
return 0;
}
POJ 2823 Sliding Window (单调队列)
标签:单调队列
原文地址:http://blog.csdn.net/u014737310/article/details/45045387