Untitled
unknown
plain_text
3 years ago
1.8 kB
6
Indexable
#include <iostream> #include <vector> using namespace std; vector <int> heap; int sz = 0; int sift_up(int i) { while (heap[i] > heap[(i - 1) / 2]) { swap(heap[i], heap[(i - 1) / 2]); i = (i - 1) / 2; } return i; } int sift_down(int i) { while (1) { if (2 * i + 1 < sz && 2 * i + 2 >= sz) { if (heap[i] < heap[2 * i + 1]) { swap(heap[i], heap[2 * i + 1]); i = 2 * i + 1; } else { return i; } } else if (2 * i + 2 < sz) { if (heap[2 * i + 2] > heap[2 * i + 1]) { if (heap[2 * i + 2] > heap[i]) { swap(heap[i], heap[2 * i + 2]); i = 2 * i + 2; } else { return i; } } else { if (heap[2 * i + 1] > heap[i]) { swap(heap[i], heap[2 * i + 1]); i = 2 * i + 1; } else { return i; } } } else { return i; } } } int add(int x) { heap.push_back(x); sz++; return sift_up(heap.size() - 1); } int get_max() { return heap[0]; } pair <int, int> extract_max() { if (sz == 0) { return {-1, -1}; } int mx = get_max(); swap(heap[0], heap[sz - 1]); sz--; int pos = sift_down(0); return {pos, mx}; } void build_heap(vector <int> &a) { for (int i = 0; i < a.size(); i++) { heap.push_back(a[i]); sz++; sift_up(i); } } void build_heap2(vector <int> &a) { for (int i = 0; i < a.size(); i++) { heap.push_back(a[i]); sz++; } for (int i = a.size() - 1; i >= 0; i--) { sift_down(i); } } int main() { int n; cin >> n; vector<int> a(n); for (int i = 0; i < n; i++) { cin >> a[i]; } build_heap2(a); for (int i = 0; i < n - 1; i++) { extract_max(); } for (int i = 0; i < n; i++) cout << heap[i] << ' '; }
Editor is loading...