POJ 2823 Sliding Window

来源:互联网 发布:jpz45加强后数据105炮 编辑:程序博客网 时间:2024/06/11 17:21
初学单调队列
对于区间中的两个元素,若j > i且a[j] >= a[i], 就可以将a[i]舍去。
主要操作为维护front与rear,用结构体记录下front的下标,出界时front出队。
每加入一个新元素,向前扫描,无效rear出队。
单调是一种去除无效值的思想,维护一个我们希望的队列。
#include <set>#include <map>#include <ctime>#include <cmath>#include <stack>#include <queue>#include <deque>#include <cstdio>#include <string>#include <vector>#include <cctype>#include <sstream>#include <utility>#include <cstring>#include <cstdlib>#include <iostream>#include <algorithm>#define SF(a) scanf("%d", &a)#define PF(a) printf("%d\n", a)  #define SFF(a, b) scanf("%d%d", &a, &b)  #define SFFF(a, b, c) scanf("%d%d%d", &a, &b, &c)#define SFFFF(a, b, c, d) scanf("%d%d%d%d", &a, &b, &c, &d)#define CLEAR(a, b) memset(a, b, sizeof(a))#define IN() freopen("in.txt", "r", stdin)#define OUT() freopen("out.txt", "w", stdout)#define FOR(i, a, b) for(int i = a; i < b; ++i)#define LL long long#define maxn 1000005#define maxm 205#define mod 1000000007#define INF 10000007#define eps 1e-4using namespace std;int buf[20], l;int read() {int x = 0; char ch = getchar(); bool f = 0;while (ch < '0' || ch > '9') { if (ch == '-') f = 1; ch = getchar(); }while (ch >= '0' && ch <= '9') x = (x << 1) + (x << 3) + (ch ^ 48), ch = getchar();return f ? -x : x;}void write(int x) {if (!x) { putchar(48); return; }l = 0; if (x < 0) putchar('-'), x = -x;while (x) buf[++l] = x % 10, x = x / 10;while (l) putchar(buf[l--] + 48);}//-------------------------CHC------------------------------//struct Node {int val, idx;}q[maxn];int n, k;int a[maxn], Max[maxn], Min[maxn];int front, rear;void get_min() {front = rear = 0;q[rear].val = a[0], q[rear++].idx = 0;FOR(i, 1, k) {while (rear > front && a[i] <= q[rear - 1].val) --rear;q[rear].val = a[i], q[rear++].idx = i;}FOR(i, k, n) {Min[i - k] = q[front].val;if (q[front].idx <= i - k) front++;while (rear > front && a[i] <= q[rear - 1].val) --rear;q[rear].val = a[i], q[rear++].idx = i;}FOR(i, 0, n - k) write(Min[i]), putchar(' ');write(q[front].val), putchar('\n');}void get_max() {front = rear = 0;q[rear].val = a[0], q[rear++].idx = 0;FOR(i, 1, k) {while (rear > front && a[i] >= q[rear - 1].val) --rear;q[rear].val = a[i], q[rear++].idx = i;}FOR(i, k, n) {Max[i - k] = q[front].val;if (q[front].idx <= i - k) front++;while (rear > front && a[i] >= q[rear - 1].val) --rear;q[rear].val = a[i], q[rear++].idx = i;}FOR(i, 0, n - k) write(Max[i]), putchar(' ');write(q[front].val), putchar('\n');}int main() {while (~SFF(n, k)) {FOR(i, 0, n) a[i] = read();get_min();get_max();}return 0;}

原创粉丝点击