λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ’» DEV/Algorithms & Data Structure

[μ•Œκ³ λ¦¬μ¦˜][C++] μš°μ„ μˆœμœ„ν, νž™ν

by vodkassi 2024. 3. 11.
728x90

λ°±μ€€ 11279: μ΅œλŒ€ νž™

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

 

11279번: μ΅œλŒ€ νž™

첫째 쀄에 μ—°μ‚°μ˜ 개수 N(1 ≤ N ≤ 100,000)이 주어진닀. λ‹€μŒ N개의 μ€„μ—λŠ” 연산에 λŒ€ν•œ 정보λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μ •μˆ˜ xκ°€ 주어진닀. λ§Œμ•½ xκ°€ μžμ—°μˆ˜λΌλ©΄ 배열에 xλΌλŠ” 값을 λ„£λŠ”(μΆ”κ°€ν•˜λŠ”) 연산이고, xκ°€ 0

www.acmicpc.net

 

 

μ ‘κ·Ό λ°©ν–₯ 및 디버깅

[1] μ΅œλŒ€νž™ κΉ‘κ΅¬ν˜„

- insert(), pop() μ‹œ 트리λ₯Ό 상/ν•˜λ‹¨μœΌλ‘œ νƒμƒ‰ν•˜μ—¬ μ•„μ΄ν…œ κ°„ λŒ€μ†ŒλΉ„κ΅λ₯Ό 톡해 κ°’ swap ν•˜λŠ” μ „μ—­ ν•¨μˆ˜ 생성

- insert() μ‹œμ—λŠ” 값을 μ΅œν•˜λ‹¨ λ…Έλ“œμ— μΆ”κ°€ν•˜μ—¬, λΆ€λͺ¨ λ…Έλ“œκ°€ λ‚˜λ³΄λ‹€ 값이 λ‚˜λ³΄λ‹€ 클 λ•ŒκΉŒμ§€ swap

- pop() μ‹œμ—λŠ” μ΅œμƒλ‹¨ 값을 μ œκ±°ν•˜κ³ , μžμ‹ λ…Έλ“œκ°€ λ‚˜λ³΄λ‹€ 값이 μž‘μ„ λ•ŒκΉŒμ§€ swap

 

[2] 라이브러리 ν™œμš©

- queue 라이브러리의 priority_queue ν™œμš©

- 기타 λ‘œμ§μ€ 동일

 

[3] 좜λ ₯ 이슈

- [1], [2] λͺ¨λ‘ 졜초 μ œμΆœμ€ μ‹œκ°„ 초과둜 μ‹€νŒ¨ν–ˆμœΌλ‚˜, λ‘œμ§μƒ λ¬Έμ œκ°€ μ—†λ‹€κ³  νŒλ‹¨ν•˜μ—¬ μ§ˆλ¬Έκ²Œμ‹œνŒμ„ 확인함. 

- https://www.acmicpc.net/board/view/22716 λ‹΅λ³€ ν™•μΈν•˜μ—¬, C++ 의 μž…μΆœλ ₯ κ΄€λ ¨ μ½”λ“œ μΆ”κ°€

- [1], [2] μ½”λ“œλ‘œ 제좜 λͺ¨λ‘ 성곡

 

μ½”λ“œ

/* [1] 2412kb, 12ms */
#define MAX 100001
#include <cstdio>
#include <iostream>

using namespace std;

int h[MAX];
int cnt = 0;

void swap(int i, int j) {
	int t = h[i];
	h[i] = h[j];
	h[j] = t;
}

void upHeapify(int i) {
	if (i == 1) return;

	if (h[i] > h[i / 2]) {
		swap(i, i / 2);
		upHeapify(i / 2);
	}
}

void downHeapify(int i) {

	int temp;

	if (i * 2 > cnt) return;

	if (i * 2 + 1 <= cnt) {
		if (h[i * 2] > h[i * 2 + 1]) {
			temp = i * 2;
		}
		else {
			temp = i * 2 + 1;
		}
	}
	else {
		temp = i * 2;
	}

	if (h[temp] > h[i]) {
		swap(i, temp);
		downHeapify(temp);
	}

}

void insert(int data) {
	h[++cnt] = data;
	upHeapify(cnt);
}

void pop() {
	h[1] = h[cnt--];
	downHeapify(1);
}

int main() {
	freopen("input.txt", "r", stdin);
	
	int N;
	cin >> N;
	

	for (int i = 0; i < N; i++) {
		int data;
		cin >> data;

		if (data > 0) {
			insert(data);
		}
		else {
			if (cnt > 0) {
				cout << h[1] << "\n";
				pop();
			}
			else {
				cout << 0 << "\n";
			}
		}
	}

	return 0;
}
/* [2] 2916KB, 16ms */

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

int main() {
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	freopen("input.txt", "r", stdin);

	int N;
	cin >> N;

	priority_queue<int> q;

	for (int i = 0; i < N; i++) {
		int data;
		cin >> data;

		if (data > 0) {
			q.push(data);
		}
		else {
			if (q.empty()) {
				cout << 0 << "\n";
			}
			else {
				cout << q.top() << "\n";
				q.pop();
			}
		}
	}

	return 0;
}

 

배운 점

- μ„±λŠ₯을 λ†’μ—¬μ£ΌλŠ” μ—¬λŸ¬ μ½”λ“œμ˜ μœ„λ ₯을 κ°„κ³Όν•˜μ§€ 말기 (ios_base::sync_with_stdio(false) λ“±)

- κΉ‘κ΅¬ν˜„μ΄ νž˜λ“€μ–΄λ„ λ©”λͺ¨λ¦¬λ‚˜ μ‹€ν–‰ 속도 μ„±λŠ₯은 더 잘 λ‚˜μ˜¨λ‹€. ν…œν”Œλ¦Ώ μ™Έμ›Œλ‘μž. 

λŒ“κΈ€