某岛

… : "…アッカリ~ン . .. . " .. .
December 25, 2010

POJ 2823. Sliding Window

Brief description:

。。维护一个宽度为 k 的滑动窗口。。分别统计所有位置的最大值和最小值。。

Analysis:

1. C++ 怎么都过。 / G++ 怎么都 TLE 。。
2. “那些500-600MS的代码到底是怎么弄出来的。。”。。
.. .

const int N = 1000009;

int a[N], q[N], cz, op;
int n, k;

template<class T> void gao(T cmp){

    cz = 0, op = -1; REP_1(i, k){
        while (cz <= op && cmp(a[i], a[q[op]])) --op;
        q[++op] = i;
    }

    printf("%d ", a[q[cz]]);

    FOR_1(i, k + 1, n){
        if (q[cz] == i - k) ++cz;
        while (cz <= op && cmp(a[i], a[q[op]])) --op;
        q[++op] = i; printf("%d ", a[q[cz]]);

    }

    puts("");
}

int main(){

#ifndef ONLINE_JUDGE
    freopen("in.txt", "r", stdin);
    //freopen("out.txt", "w", stdout);
#endif

    RD(n, k); REP_1(i, n) RD(a[i]);
    gao(less<int>()), gao(greater<int>());
}

External link:

http://acm.hust.edu.cn:8080/judge/problem/viewProblem.action?id=16694