알고리즘/구현,시뮬
BOJ - 11003 ) 최솟값 찾기
개발자가될수있을까?
2021. 3. 10. 21:51


1717번: 집합의 표현
첫째 줄에 n(1 ≤ n ≤ 1,000,000), m(1 ≤ m ≤ 100,000)이 주어진다. m은 입력으로 주어지는 연산의 개수이다. 다음 m개의 줄에는 각각의 연산이 주어진다. 합집합은 0 a b의 형태로 입력이 주어진다. 이는
www.acmicpc.net
배열을 O(n)탐색하면서 현재 값보다 큰 값은 빼주고, index가 범위 밖에 있는것도 빼준다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayDeque;
import java.util.StringTokenizer;
public class 최솟값찾기 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int L = Integer.parseInt(st.nextToken());
st = new StringTokenizer(br.readLine()," ");
StringBuilder sb = new StringBuilder();
ArrayDeque<Integer> dq = new ArrayDeque<>();
int arr[] = new int[N];for(int i=0;i<N;i++)arr[i] = Integer.parseInt(st.nextToken());
for(int i=0;i<N;++i) {
while(!dq.isEmpty()&&dq.peekFirst()<=i-L) dq.removeFirst();
while(!dq.isEmpty()&&arr[dq.peekLast()]>=arr[i]) dq.removeLast();
dq.offer(i);
sb.append(arr[dq.peek()]+" ");
}
bw.write(sb.toString());
bw.flush();bw.close();
}
}
