标签:数组 name -- microsoft 依次 names 数值 是的 printf
单调队列,顾名思义是指队列内的元素是有序的,队头为当前的最大值(单调递减队列)或最小值(单调递增序列),以单调递减队列为例来看队列的入队和出队操作:
1、入队:
如果当前元素要进队,把当前元素和队尾元素比较,如果当前元素小于队尾元素,那么当前元素直接进队,如果当前元素大于队尾元素,那么队尾出队,将当前元素和新的队尾再做比较,直到当前元素大于队尾元素或者队列为空。单调队列只能在队尾插入元素,队尾和队头都可以删除元素。
2、出队:
出队直接取队头即可,因为用单调队列就是为了取最值,而队头就是最值。
例子:将数组a[] = {3, 5, 2, 8, 1, 4, 7}依次入队,并保证队列为一个 单调递减 队列。
#include<iostream>
#include<cstdio>
using namespace std;
int n,m,a[2000010];
int q[2000010],h=1,t=1;
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
printf("0\n");
q[1]=1;
for(int i=2;i<=n;i++)
{
printf("%d\n",a[q[h]]);
if(q[h]<=i-m)
h++;
while(a[i]<=a[q[t]]&&t>=h)
t--;
t++;
q[t]=i;
}
return 0;
}
标签:数组 name -- microsoft 依次 names 数值 是的 printf
原文地址:http://www.cnblogs.com/widerg/p/7045190.html