题目链接
http://poj.org/problem?id=2823
分析
单调队列模板,在从队尾出队时,可以用二分快速找到最终位置,但效果并不明显。
AC代码
#include <cstdio>
inline int read() {
int num = 0, flag = 1;
char c = getchar();
while (c < '0' || c > '9') {
if (c == '-') flag = -1;
c = getchar();
}
while (c >= '0' && c <= '9')
num = num * 10 + c - '0', c = getchar();
return flag * num;
}
void write(int x) {
if (x < 0) putchar('-'), x = -x;
if (x > 9) write(x / 10);
putchar(x % 10 + '0');
}
const int maxn = 1e6 + 5;
struct Node {
int id, v;
Node(int i = 0, int v = 0) : id(i), v(v) {}
};
Node minq[maxn], maxq[maxn];
int l1 = 1, r1, l2 = 1, r2, ans1[maxn], ans2[maxn];
int main() {
int n = read(), k = read();
for (int i = 1; i <= n; ++i) {
int x = read(), l = l1 - 1, r = r1;
while (l < r) {
int mid = (l + r + 1) >> 1;
if (minq[mid].v < x) l = mid;
else r = mid - 1;
}
r1 = l;
minq[++r1] = Node(i, x);
if (i - minq[l1].id >= k) ++l1;
l = l2 - 1, r = r2;
while (l < r) {
int mid = (l + r + 1) >> 1;
if (maxq[mid].v > x) l = mid;
else r = mid - 1;
}
r2 = l;
maxq[++r2] = Node(i, x);
if (i - maxq[l2].id >= k) ++l2;
ans1[i] = minq[l1].v, ans2[i] = maxq[l2].v;
}
for (int i = k; i <= n; ++i) write(ans1[i]), putchar(' ');
puts("");
for (int i = k; i <= n; ++i) write(ans2[i]), putchar(' ');
return 0;
}