Sliding Window POJ

题解:从前往后,维护一个从栈底到栈顶递增的栈,那么每个区间的最小值就是栈底。从后往前,维护一个从栈顶到栈底递增的栈,那么每个区间的最大值就是栈底。

//#include<bits/stdc++.h>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<bitset>
#include<vector>
#include<queue>
#include<map>
#include<string>
#include<stack>
#define ll long long
#define P pair<int, int>
#define PP pair<int,pair<int, int>>
#define pb push_back
#define pp pop_back
#define lson root << 1
#define INF (int)2e9 + 7
#define rson root << 1 | 1
#define LINF (unsigned long long int)1e18
#define mem(arry, in) memset(arry, in, sizeof(arry))
using namespace std;

const int N = 1e6 + 10;

int n, k;
int a[N], b[N], c[N], Max[N], Min[N];

void solve() {
    int l = 0, r = 0;
    for(int i = n;  i >= 1; i--) {
        while(r > l && b[l] > i + k - 1) l++;
        while(r > l && a[b[r - 1]] <= a[i]) r--;
        b[r++] = i;
        if(i > n - k + 1) continue;
        Max[i] = a[b[l]];
    }
    for(int i = 1; i <= n; i++) {
        while(r > l && a[c[r - 1]] >= a[i]) r--;
        c[r++] = i;
        if(i < k) continue;
        while(r > l && c[l] < i - k + 1) l++;
        Min[i] = a[c[l]];
    }
}

int main()
{
    scanf("%d %d", &n, &k);
    for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
    solve();
    for(int i = k; i <= n; i++) printf("%d%c", Min[i], (i == n ? '
' : ' '));
    for(int i = 1; i <= n - k + 1; i++) printf("%d%c", Max[i], (i == n - k + 1 ? '
' : ' '));
    return 0;
}
原文地址:https://www.cnblogs.com/zgglj-com/p/9395427.html