【SPOJ-ARRAYSUB】subarrays【单调队列】

来源:互联网 发布:东安格利亚大学知乎 编辑:程序博客网 时间:2024/05/19 11:38

题意:

给出n个数,问连续k个最大值。


裸的单调队列。

一发AC。


(把k给在数后面大概是为了防止读入时就处理数据吧...)


#include <cstdio>#include <algorithm>using namespace std;const int maxn = 1000005;int n, k, num[maxn];struct _data {int w, pos;} q[maxn];inline int iread() {int f = 1, x = 0; char ch = getchar();for(; ch < '0' || ch > '9'; ch = getchar()) f = ch == '-' ? -1 : 1;for(; ch >= '0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';return f * x;}int main() {n = iread();for(int i = 1; i <= n; i++) num[i] = iread();k = iread(); k = min(k, n);int h = 1, t = 0;for(int i = 1; i < k; i++) {for(; h <= t && q[t].w <= num[i]; t--);q[++t] = (_data) {num[i], i};}for(int i = k; i <= n; i++) {for(; h <= t && q[h].pos <= i - k; h++);for(; h <= t && q[t].w <= num[i]; t--);q[++t] = (_data) {num[i], i};printf("%d ", q[h].w);}return 0;}


0 0
原创粉丝点击