1 solutions

  • 0
    @ 2026-1-28 15:30:16
    #include <iostream>
    using namespace std;
    
    const int MAXN = 1000005;
    int arr[MAXN];
    int minRes[MAXN], maxRes[MAXN]; // 存储结果
    
    // 单调队列(用数组实现)
    int minQ[MAXN], maxQ[MAXN]; // 存储下标
    int minHead, minTail; // 队首和队尾指针
    int maxHead, maxTail;
    
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(0);
    
        int n, k;
        cin >> n >> k;
    
        for (int i = 0; i < n; i++) {
            cin >> arr[i];
        }
    
        // 求最小值 - 单调递增队列
        minHead = 0;
        minTail = 0;
        int minCnt = 0;
    
        for (int i = 0; i < n; i++) {
            // 移除队首过期元素(不在窗口内)
            while (minHead < minTail && minQ[minHead] < i - k + 1) {
                minHead++;
            }
    
            // 维护单调性:移除队尾所有≥当前元素的值
            while (minHead < minTail && arr[minQ[minTail - 1]] >= arr[i]) {
                minTail--;
            }
    
            // 当前元素入队
            minQ[minTail++] = i;
    
            // 窗口形成后记录答案
            if (i >= k - 1) {
                minRes[minCnt++] = arr[minQ[minHead]];
            }
        }
    
        // 求最大值 - 单调递减队列
        maxHead = 0;
        maxTail = 0;
        int maxCnt = 0;
    
        for (int i = 0; i < n; i++) {
            // 移除队首过期元素
            while (maxHead < maxTail && maxQ[maxHead] < i - k + 1) {
                maxHead++;
            }
    
            // 维护单调性:移除队尾所有≤当前元素的值
            while (maxHead < maxTail && arr[maxQ[maxTail - 1]] <= arr[i]) {
                maxTail--;
            }
    
            // 当前元素入队
            maxQ[maxTail++] = i;
    
            // 窗口形成后记录答案
            if (i >= k - 1) {
                maxRes[maxCnt++] = arr[maxQ[maxHead]];
            }
        }
    
        // 输出最小值
        for (int i = 0; i < minCnt; i++) {
            if (i > 0) cout << " ";
            cout << minRes[i];
        }
        cout << "\n";
    
        // 输出最大值
        for (int i = 0; i < maxCnt; i++) {
            if (i > 0) cout << " ";
            cout << maxRes[i];
        }
        cout << "\n";
    
        return 0;
    }
    
    
    • 1

    Information

    ID
    101
    Time
    1000ms
    Memory
    512MiB
    Difficulty
    10
    Tags
    # Submissions
    1
    Accepted
    1
    Uploaded By