TLE #11,手写小根堆
查看原帖
TLE #11,手写小根堆
715342
pxlamda楼主2023/3/7 13:39
#define _CRT_SECURE_NO_WARNINGS

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<vector>

void swap(int& a, int& b) {
	int t = a;
	a = b;
	b = t;
}

class heap_min {
private:
	int size;
	int ans[1000001];
public:
	heap_min():size(0) {}
	void insert(int x);
	int remove();
	int top();
	void sort_in(int ans[]);
	void sort_out(int ans[]);
	int num() { return size; }
};

void heap_min::sort_in(int ans[]) {

	bool flag = 0;
	int mid = (size - 2) / 2;
	for (; mid >= 0; mid--) {
		if (mid * 2 + 2 >= size) {
			if (ans[mid * 2 + 1] < ans[mid])
				swap(ans[mid], ans[mid * 2 + 1]);
		}
		else {
			if (ans[mid * 2 + 1] < ans[mid * 2 + 2] && ans[mid * 2 + 1] < ans[mid]) {
				swap(ans[mid], ans[mid * 2 + 1]);
			}
			else if (ans[mid * 2 + 1] >= ans[mid * 2 + 2] && ans[mid * 2 + 2] < ans[mid]) {
				swap(ans[mid], ans[mid * 2 + 2]);
			}
			else;
		}
	}
};

void heap_min::sort_out(int ans[]) {
	
	for (int j = 0; j * 2 + 1 < size;) {
		if (j * 2 + 2 >= size) {
			if (ans[j * 2 + 1] < ans[j]) {
				swap(ans[j * 2 + 1], ans[j]);
				j = j * 2 + 1;
			}
			else break;
		}
		else {
			if (ans[j * 2 + 1] < ans[j * 2 + 2] && ans[j * 2 + 1] < ans[j]) {
				swap(ans[j * 2 + 1], ans[j]);
				j = j * 2 + 1;
			}
			else if (ans[j * 2 + 1] >= ans[j * 2 + 2] && ans[j * 2 + 2] < ans[j]) {
				swap(ans[j * 2 + 2], ans[j]);
				j = j * 2 + 2;
			}
			else break;
		}
	}
};

void heap_min::insert(int x) {
	size++;
	ans[size - 1] = x;
	if (size == 1) return;
	else {
		sort_in(ans);
	}
}

int heap_min::remove() {
	int backval;
	if (size <= 1) {
		backval = ans[size - 1];
		size--;
		return backval;
	}
	else {
		swap(ans[0], ans[size - 1]);
		backval = ans[size - 1];
		size--;
		sort_out(ans);
		return backval;
	}
}
int heap_min::top() {
	return ans[0];
}

heap_min h;

int main() {
	//std::freopen("P3378_11.in","r",  stdin);
	int n, op, x;
	scanf("%d", &n);
	for (int i = 0; i < n; i++) {
		scanf("%d", &op);
		if (op == 1) {
			scanf("%d", &x);
			h.insert(x);
		}
		else if (op == 2) {
			x = h.top();
			printf("%d\n", x);
		}
		else {
			h.remove();
		}
	}
	return 0;
}
2023/3/7 13:39
加载中...