#include <iostream>
#include <algorithm>
#include <vector>
#include <set>
int main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(NULL);
int x = 0;
std::cin >> x;
std::multiset<int, std::greater<int>> multiset = {};
for (int i = 0; i < x; ++i)
{
int iNumber = 0;
std::cin >> iNumber;
if (iNumber)
{
multiset.insert(iNumber);
}
else
{
if (!multiset.empty())
{
std::cout << *multiset.begin() << "\n";
multiset.erase(multiset.begin());
}
else
{
std::cout << 0 << "\n";
}
}
}
return 0;
}
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
int main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(NULL);
int x = 0;
std::cin >> x;
std::priority_queue<int> priQue = {};
for (int i = 0; i < x; ++i)
{
int iNumber = 0;
std::cin >> iNumber;
if (iNumber)
{
priQue.push(iNumber);
}
else
{
if (!priQue.empty())
{
std::cout << priQue.top() << "\n";
priQue.pop();
}
else
{
std::cout << 0 << "\n";
}
}
}
return 0;
}
처음엔 Set으로 했다가 바로 시간 초과당해서 Que로 만들어서 했습니다.
근데 문제는 그게 아니라 tie(NULL)이랑 sync_with_studio(false)... ㅎㅎ....
Que로 했을 경우가 훨씬 싸게 먹혔습니다.
그 이유는
둘 다 정렬 기능을 가진 Tree형태의 자료구조이지만 내부 구조가 다릅니다.
priQue는 삽입과 삭제에 의해서 부모, 자식간의 우선순위는 확실하게 보장되지만, 양옆 노드와의 우선순위를 정의할 수 없습니다. 부모 노드는 자식 노드보다 우선순위가 높기 때문에 루트 노드가 최고 우선순위의 노드 라는 것"만" 보장합니다.
Set은 이진 트리 중 이진 '탐색' 트리 이기 때문에 노드의 위치만 파악할 수 있다면 위, 아래, 양옆 모든 노드와도 우선순위를 비교할 수 있습니다.
'오늘의 알고리즘' 카테고리의 다른 글
[C++] 백준 1992 쿼드트리 (0) | 2022.09.12 |
---|---|
[C++] 백준 11726 2xn 타일링 (0) | 2022.09.10 |
[C++]백준 9095 1, 2, 3 더하기 (0) | 2022.09.06 |
[C++] 백준 7662 이중 우선순위 큐 (0) | 2022.09.06 |
[C++] 백준 7576 토마토 (0) | 2022.09.04 |