-
백준 7662 (이중 우선순위 큐) c++백준 문제 2022. 8. 16. 00:03728x90
명령문을 입력 받습니다.
예를 들어
I 60 이면 벡터에 60을 삽입합니다.
D -1 이면 벡터 값 중에 최솟값을 삭제합니다.
D 1 이면 벡터 값 중에서 최댓값을 삭제합니다.
k개의 명령문이 끝나고 남아있는 벡터의 최댓값과 최솟값을 출력하면 되는 문제입니다.
만약 벡터가 비어있으면 "EMPTY"를 출력하면 됩니다.
처음에 생각한 방안은 priority queue를 오름차순과 내림차순으로 두가지의 큐를 관리해
D 명령어를 처리하는 방식입니다.
하지만 이렇게 되면 오름차순에서 삭제된 원소가 내림차순에 존재하게 됩니다. 반대도 마찬가지 입니다.
따라서 추가적인 장치가 필요합니다.
바로 MAP을 이용하는 것입니다.
문제에서 삽입되는 원소들은 중복으로 주어질 수 있으니까 MAP을 <int, int>로 선언해
만약 "I 58" 이라는 명령어가 들어오면 <58, 1> 로 삽입해 주고 또 58이 들어오면 MAP[58]++하게 해주면 됩니다.
즉, MAP을 이용해 삽입된 원소와 삭제된 원소를 체크해주고 D 명령문이 들어올 때마다 정리해주면 됩니다.
전체 코드입니다.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475#include <iostream>#include <algorithm>#include <cstring>#include <vector>#include <string>#include <stack>#include <queue>#include <deque>#include <cmath>#include <map>#include <set>#include <tuple>#define MAX 2100000000#define inf LONG_MAX#define big(a, b) a > b ? a : busing namespace std;using ll = long long;using ull = unsigned long long;int main() {ios_base::sync_with_stdio(false), cin.tie(NULL), cout.tie(NULL);int t;cin >> t;while (t--) {map<int, int>m;priority_queue<int>up;priority_queue<int, vector<int>, greater<int>>down;vector<int>v;int k;cin >> k;for (int i = 0; i < k; i++) {char c;cin >> c;if (c == 'I') {int a;cin >> a;up.push(a);down.push(a);if (m.count(a) == 0)m[a] = 1;elsem[a]++;}else {int a;cin >> a;if (a == -1 && !down.empty()) {if (!m[down.top()])while (!down.empty() &&!m[down.top()])down.pop();if (!down.empty()) {m[down.top()]--;down.pop();}}else if (a == 1 && !up.empty()) {if (!m[up.top()])while (!up.empty()&&!m[up.top()])up.pop();if (!up.empty()) {m[up.top()]--;up.pop();}}}}if (!up.empty())while (!up.empty() && !m[up.top()])up.pop();if (!down.empty())while (!down.empty()&&!m[down.top()])down.pop();if (up.empty() && down.empty()) cout << "EMPTY" << '\n';else cout << up.top() << ' ' << down.top() << '\n';}return 0;}cs '백준 문제' 카테고리의 다른 글
백준 14500 (테트로미노) c++ (0) 2022.08.21 백준 9019 (DSLR) C++ (0) 2022.08.18 백준 5430 (AC) C++ (0) 2022.08.10 백준 1107 (리모컨) c++ (0) 2022.08.09 백준 6064 (카잉 달력) c++ (0) 2022.08.07