(문제)
https://www.acmicpc.net/problem/7662
7662: 이중 우선 순위 큐
입력 데이터에는 표준 입력이 사용됩니다.
입력은 t-테스트 데이터로 구성됩니다.
입력 데이터의 수를 나타내는 정수 T가 첫 번째 입력 라인에 제공됩니다.
모든 테스트 데이터의 첫 번째 행에 Q 쓰기
www.acmicpc.net
(설명)
이전 프로그래머의 솔루션에서와 같이 두 개의 minHeap 및 maxHeap을 사용한 구현이 시간 초과되었습니다.
다른 우선 순위 대기열에서 항목을 제거하기 위해 remove()를 사용할 때 O(N)이 필요하기 때문에 시간 초과가 발생합니다.
따라서 Priority Queue 대신 TreeMap을 사용하면 원하는 항목을 바로 찾아서 제거할 수 있다.
(암호)
package heap_stack_dequeue;
import java.util.*;
import java.io.*;
public class boj_7662_java{
static int t;
public static void main(String() args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
t = Integer.parseInt(br.readLine());
while(t-->0){
int n = Integer.parseInt(br.readLine());
TreeMap<Integer, Integer> tm = new TreeMap<>();
for(int i=0; i<n; i++){
StringTokenizer st = new StringTokenizer(br.readLine());
char order = st.nextToken().charAt(0);
if(order=='I'){
int num = Integer.parseInt(st.nextToken());
tm.put(num, tm.getOrDefault(num, 0)+1);
}
else if(!
tm.isEmpty()){
int option = Integer.parseInt(st.nextToken());
if(option==1){
//최댓값 삭제
int num = tm.lastKey();
if(tm.get(num)==1){
tm.remove(num);
}
else{
tm.put(num, tm.get(num)-1);
}
}
else{
//최솟값 삭제
int num = tm.firstKey();
if(tm.get(num)==1){
tm.remove(num);
}
else{
tm.put(num, tm.get(num)-1);
}
}
}
}
if(tm.isEmpty()){
System.out.println("EMPTY");
}
else{
System.out.println(tm.lastKey() + " " + tm.firstKey());
}
}
}
}