一次堆排序当然比很多次sort快很多 一次堆排序虽然和一次快排时间复杂度一样,但是优先队列的使用是整个堆排序流程的拆散、充分利用,做入堆、出堆这么多事情,其实整体只不过是一次堆排序,是一次建堆、输出序列的顺序打乱版本而已。

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

using namespace std;

class Complex{
public:
	int real;
	int imag;
	Complex(int a, int b):real(a),imag(b){}
	bool operator<(const Complex &c) const {
		if(real*real+imag*imag==c.real*c.real+c.imag*c.imag){
			return imag > c.imag;
		}else{
			return real*real+imag*imag < c.real*c.real+c.imag*c.imag;
		}
	}
};



int main(){
	int n;
	while(scanf("%d",&n) != EOF){
		priority_queue<Complex> q;
		while(n--){
			string s;
			cin >> s;
			if(s == "Pop"){
				if(q.empty()){
					printf("empty\n");
				}else{
					Complex current = q.top();
					q.pop();
					printf("%d+i%d\n", current.real, current.imag);
					printf("SIZE = %d\n", q.size());
				}
			}else{
				int a,b;
				scanf("%d+i%d", &a, &b);
				q.push(Complex(a,b));
				printf("SIZE = %d\n",q.size());
			}
		}
	}
	return 0;
}

//int main(){
//	int n;
//	while(scanf("%d",&n) != EOF){
//		vector<Complex> v;
//		while(n--){
//			string s;
//			cin >> s;
//			if(s == "Pop"){
//				if(v.empty()){
//					printf("empty\n");
//				}else{
//					Complex current = v[v.size()-1];
//					v.erase(v.end()-1);
//					printf("%d+i%d\n", current.real, current.imag);
//					printf("SIZE = %d\n", v.size());
//				}
//			}else{
//				int a,b;
//				scanf("%d+i%d", &a, &b);
//				v.push_back(Complex(a,b));
//				sort(v.begin(),v.end());
//				printf("SIZE = %d\n",v.size());
//			}
//		}
//	}
//	return 0;
//}