手写堆wa求助
  • 板块学术版
  • 楼主xz001
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/10/12 20:39
  • 上次更新2023/11/2 14:14:56
查看原帖
手写堆wa求助
674967
xz001楼主2023/10/12 20:39
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>

#define int long long
using namespace std;


template <class T> 
class priority_queue {
	private:
		int t[1000005], siz;
		inline int ls (int p) { return p << 1;}  
		inline int rs (int p) { return p << 1 | 1;}
		inline int fa (int p) {	return p >> 1;}
	
	public: 
	    priority_queue () {
	    	siz = 0;
		}
		inline void push(T a) {
			t[++ siz] = a;
			int at = siz;
			while (at != 1) {
				if (t[fa(at)] > t[at]) {
					swap(t[fa(at)], t[at]);
					at = fa(at);
				} else break;
			} 
			return;
		}
		inline void pop() {
			if (!siz) return;
			t[1] = t[siz --];
			int at = 1;
			while (at <= siz) {
				if (t[at] <= max(t[ls(at)], t[rs(at)])) break;
				if (t[ls(at)] > t[rs(at)]) {
					swap(t[ls(at)], t[at]);
					at = ls(at);
				} else {
					swap(t[rs(at)], t[at]);
					at = rs(at);
				}
			}
			return;
		}
		inline int size() {
			return siz;
		}
		inline T top() {
			return t[1];
		}
};
priority_queue <int> q;
signed main() {
	int n;
	scanf("%lld", &n);
	while (n -- ) {
		int op;
		scanf("%lld", &op);
		if (op == 1) {
			int x;
			scanf("%lld", &x);
			q.push(x); 
		} else if (op == 2) {
			printf("%lld\n", q.top());
		} else { 
			q.pop();
		}
	}
	return 0;
}
2023/10/12 20:39
加载中...