import java.util.*;
import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int k = sc.nextInt();
        int[] a = new int[n + 1]; // 1-based数组

        for (int i = 1; i <= n; i++) {
            a[i] = sc.nextInt();
        }

        // 处理最小值队列
        Deque<Integer> minDeque = new ArrayDeque<>();
        List<Integer> minRes = new ArrayList<>();
        for (int i = 1; i <= n; i++) {
            // 移除超出窗口的队头元素
            //通过这一个while循环,可以保证加入最小序号队列minQueue的序号始终是在窗口内的
            while (!minDeque.isEmpty() && minDeque.peekFirst() <= i - k) {
                minDeque.pollFirst();
            }
            // 维护队列递增,移除比当前大的队尾元素,通过这种事先比较,使minQueue里面队尾的序号所对应的值只小不大
            //为什么不是队首,因为队首到目前为止可以加进去,已经证明它是最小的了,能让它滚出去只能是不在要求序号范围内
            while (!minDeque.isEmpty() && a[minDeque.peekLast()] >= a[i]) {
                minDeque.pollLast();
            }
            //为什么要将每一个i都加入,是为了确保每一个i都经历比较
            minDeque.addLast(i);
            if (i >= k) {
                //经历比较后,minQueue里面的首部序号一定是最小的,为什么要经历一个判断之后再加入:
                //是因为第一组的时候,i小于k,此时,并没有比较完(第一组)
                minRes.add(a[minDeque.peekFirst()]);
            }
        }
//
        // 处理最大值队列
        Deque<Integer> maxDeque = new ArrayDeque<>();
        List<Integer> maxRes = new ArrayList<>();
        for (int i = 1; i <= n; i++) {
            // 移除超出窗口的队头元素
            while (!maxDeque.isEmpty() && maxDeque.peekFirst() <= i - k) {
                maxDeque.pollFirst();
            }
            // 维护队列递减,移除比当前小的队尾元素
            while (!maxDeque.isEmpty() && a[maxDeque.peekLast()] <= a[i]) {
                maxDeque.pollLast();
            }
            maxDeque.addLast(i);
            if (i >= k) {
                maxRes.add(a[maxDeque.peekFirst()]);
            }
        }

        // 输出结果
        for (int num : minRes) System.out.print(num + " ");
        System.out.println();
        for (int num : maxRes) System.out.print(num + " ");
        System.out.println();
    }
}

 

posted on 2025-05-29 22:34  fafrkvit  阅读(6)  评论(1)    收藏  举报