话说单调队列!= 优先队列。可怜我捧着算导看了半天优先队列。题意读的很费劲,最后问得师兄。就是给定一个M,然后再给一个序列,求给出的序列里连续M个数中的最大值。最后把这些最大值输出,其实就是很裸的单调队列。然后开始在网上搜有关单调队列的资料,从这里http://www.felix021.com/blog/read.php?1965学会的。其实就是维持队列的单调性,别管是单调增还是单调减。队头元素永远是最列的最小值(或最大值)。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int N = 25005;
struct node {
int i;
int num;
}q[N];
int ans[N];
int main() {
//freopen("data.in", "r", stdin);
int m, t, k;
int f, r;
scanf("%d", &m);
scanf("%d", &t);
f = r = k = 0;
while(t != -1) {
if(f < r && q[f].i <= k - m) f++; //太旧的元素删除
while(f < r && q[r-1].num <= t) r--; //比t小的元素删除
q[r].i = k; q[r].num = t; r++; //入队列
ans[k] = q[f].num; k++;
scanf("%d", &t);
}
for(t = m-1; t < k; t++)
printf("%d\n", ans[t]);
return 0;
}
PS:开始把内存空间开小了,Crash了两次。个人感觉可以用滚动数组优化,不过没写。。。