https://www.acmicpc.net/problem/11003
deque<Integer, Integer> : 데크에 (인덱스, 값) 형태로 저장
deque[0] : 구간 내 최소값 저장
deque[i] (i > 0) : 구간 내 최소값 후보들 저장
- 데크의 맨 앞값(최소값)이 현재 필요한 범위를 벗어날 경우 빼줌.
- 현재값을 데크의 뒤에 넣되 현재값보다 큰 값들을 뒤에서 모두 빼줌
import java.io.*;
import java.util.*;
public class Main {
public static BufferedReader br;
public static BufferedWriter bw;
public static class Point {
int ind, v;
public Point(int ind, int v) {
this.ind = ind;
this.v = v;
}
}
public static int N, M;
public static void input() throws IOException {
br = new BufferedReader(new InputStreamReader(System.in));
bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
}
public static void solve() throws IOException {
StringTokenizer st = new StringTokenizer(br.readLine());
Deque<Point> dq = new ArrayDeque<>();
for (int i = 0; i < N; i++) {
int num = Integer.parseInt(st.nextToken());
//1. 데크의 맨 앞값(최소값)이 인덱스 넘어서면 빼줌
if (!dq.isEmpty() && dq.getFirst().ind < i - M + 1) dq.pollFirst();
//2. 현재값을 뒤에 넣되 현재값보다 큰 값들 뒤에서 모두 빼줌
if (!dq.isEmpty()) {
while(true) {
if (dq.isEmpty()) break;
if (dq.getLast().v >= num) dq.pollLast();
else break;
}
}
dq.addLast(new Point(i, num));
bw.write(dq.getFirst().v + " ");
}
bw.flush();
}
public static void main(String[] args) throws IOException {
input();
solve();
}
}