나의 브을로오그으

[c++] 7662번 : 이중 우선순위 큐 본문

알고리즘/BaekJoon

[c++] 7662번 : 이중 우선순위 큐

__jhp_+ 2022. 10. 26. 12:37

https://www.acmicpc.net/problem/7662

 

7662번: 이중 우선순위 큐

입력 데이터는 표준입력을 사용한다. 입력은 T개의 테스트 데이터로 구성된다. 입력의 첫 번째 줄에는 입력 데이터의 수를 나타내는 정수 T가 주어진다. 각 테스트 데이터의 첫째 줄에는 Q에 적

www.acmicpc.net

#include <iostream>
#include <vector>
#include <queue>

using namespace std;

#define MAX_SIZE						1'000'000
#define DELETE_MIN_INSTRUCTION			-1
#define DELETE_MAX_INSTRUCTION			1


void SyncPriorityMinQ(
	bool* invalid,
	priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>>& minQ
)
{
	while (minQ.empty() == false && invalid[minQ.top().second] == true)
	{
		minQ.pop();
	}

	return;
}

void SyncPriorityMaxQ(
	bool* invalid,
	priority_queue<pair<int, int>, vector<pair<int, int>>>& maxQ
) {
	while (maxQ.empty() == false && invalid[maxQ.top().second] == true)
	{
		maxQ.pop();
	}

	return;
}

void PrintQ(
	priority_queue<pair<int, int>, vector<pair<int, int>>>& maxQ,
	priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>>& minQ
) {
	bool empty = maxQ.empty() || minQ.empty();
	if (empty == true)
	{
		cout << "EMPTY" << '\n';
	}
	else
	{
		cout << maxQ.top().first << ' ' << minQ.top().first << '\n';
	}

	return;
}

void Progress(
	priority_queue<pair<int, int>, vector<pair<int, int>>>& maxQ,
	priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>>& minQ
) {
	bool invalid[MAX_SIZE] = { false, };
	int N, num;
	char order;

	cin >> N;
	for (int index = 0; index < N; ++index)
	{
		cin >> order >> num;
		if (order == 'I')
		{
			minQ.emplace(num, index);
			maxQ.emplace(num, index);
		}
		else if (order == 'D')
		{
			if (num == DELETE_MIN_INSTRUCTION)
			{
				SyncPriorityMinQ(invalid, minQ);
				if (minQ.empty() == false)
				{
					int del = minQ.top().second;
					invalid[del] = true;
					minQ.pop();
				}
			}
			else if (num == DELETE_MAX_INSTRUCTION)
			{
				SyncPriorityMaxQ(invalid, maxQ);
				if (maxQ.empty() == false)
				{
					int del = maxQ.top().second;
					invalid[del] = true;
					maxQ.pop();
				}
			}

		}
	}

	SyncPriorityMinQ(invalid, minQ);
	SyncPriorityMaxQ(invalid, maxQ);
	return;
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(NULL);

	int T;
	cin >> T;
	for (int i = 0; i < T; ++i)
	{
		vector<pair<int, int>> v1;
		vector<pair<int, int>> v2;
		v1.reserve(MAX_SIZE);
		v2.reserve(MAX_SIZE);

		priority_queue<pair<int, int>, vector<pair<int, int>>> maxQ(less<pair<int, int>>(), move(v1));
		priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> minQ(greater<pair<int, int>>(), move(v2));

		Progress(maxQ, minQ);
		PrintQ(maxQ, minQ);
	}

	return 0;
}

'알고리즘 > BaekJoon' 카테고리의 다른 글

[c++] 10026번 : 적록색약  (0) 2022.11.16
[c++] 9019번 : DSLR  (0) 2022.10.27
[c++] 7576번 : 토마토  (0) 2022.10.21
[c++] 7569번 : 토마토  (0) 2022.10.19
[c++] 18870번 : 좌표 압축  (0) 2022.10.12