페이지가 로드되지 않나요? 여기를 눌러보면 고쳐질 수도 있어요.
Placeholder

#4905

STL - Priority Queue 1초 32MB

문제

priority_queue(우선순위큐)는 로그시간안에 삽입 및 가장 큰 원소의 추출을 제공하는 컨테이너 어댑터(container adaptor)다.

 

priority_queue는 기본적으로 앞서 배운 힙(heap), 그 중 최대힙(max heap)으로 구현이 되어있다.

최소힙(min heap)을 사용하고 싶다면 std::greater<T>를 사용하면 된다.

 

기본적인 함수로는 아래와 같은 함수들이 있다.

 

push(): 원소를 삽입한다

pop():top의 원소를 제거한다

top(): top에 있는 원소인 우선순위가 높은 원소를 반환한다

empty(): 비어있으면 true, 아니면 false를 반환한다

size(): 원소의 수를 반환한다

 

사용법은 아래와 같다.

#include <iostream>
#include <queue>
#include <vector>
using namespace std;

int main()
{
    const auto data = {1,8,5,6,3,4,0,9,7,2};

    // 최대힙 선언 및 push함수로 원소 삽입
    priority_queue<int> max_heap;
    for(int n : data) max_heap.push(n);

    // 최소힙 및 초기화
    priority_queue<int, vector<int>, greater<int> > min_heap(data.begin(), data.end());

    // 힙 출력
    while(!max_heap.empty()){
        printf("%d ", max_heap.top());
        max_heap.pop();
    }
    printf("\n");

    while(!min_heap.empty()){
        printf("%d ", min_heap.top());
        min_heap.pop();
    }
    printf("\n");

    return 0;

}

priority_queue의 자료형은 변경이 가능하기에 구조체 또한 사용이 가능하다.

다만 구조체를 사용 할 때는 연산자 오버로딩을 통해 어떤 원소가 더 우선순위가 높은지 설정해줘야한다.

 

[문제]

정올 외과 응급실에서는 환자들을 입원시킬 때 환자의 나이와 출혈량을 물어본다.

출혈량이 높을 수록 더 먼저 수술을 받게 되는데, 출혈량이 같다면 고령의 환자를 먼저 수술한다.

 

환자의 입원과 수술 데이터를 실시간으로 처리하는 프로그램을 작성하라.

입원 데이터는 "push Thomas 37 ​120.6" 와 같이 이름, 나이, 출혈량(ml) 순서로 주어지며,

수술 데이터는 "pop"으로 주어진다. 이 경우 환자가 없다면 무시된다.


입력

첫 번째 줄에 전체 쿼리의 수 Q가 주어진다. (1 \le Q \le 100,000)

두 번째 줄부터 Q+1 번째 줄까지 쿼리가 주어진다.

입원의 경우 push 뒤에 이름,​ 나이, 출혈량이 공백을 기준으로 주어진다. 

(이름의 길이는 50자를 넘지 않고, 나이는 200을 넘지 않는 정수가 주어지며, 출혈량은 10\ 000이 넘지 않는 실수가 주어진다)

수술의 경우 pop이 주어진다.


출력

환자가 수술을 할 때 마다 환자의 이름을 출력한다.


예제1

입력
5

pushDavid25103.7
pushBen2980.3
pop
pushEvan2980.4
pop
출력
David

Evan


출처

klee

역링크