#include <iostream> #include <cstdio> #include <queue> using namespace std; /* * 复数 */ struct Complex { int real; int imag; Complex(int real, int imag) { this->real = real; this->imag = imag; } /** * 重载小于号 * 即,优先级递增 * @param c * @return */ bool operator<(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; } } }; priority_queue<Complex> myPriorityQueue; /** * 复数集合--北京邮电大学 * @return */ int main() { int n; while (scanf("%d", &n) != EOF) { string instruction; cin >> instruction; if (instruction == "Pop") { /* * 指令为Pop * 判断优先队列是否为空,空则输出empty;否则输出并删除最大复数 */ if (myPriorityQueue.empty()) { printf("empty\n"); } else { Complex cur = myPriorityQueue.top(); myPriorityQueue.pop(); printf("%d+i%d\n", cur.real, cur.imag); printf("SIZE = %d\n", myPriorityQueue.size()); } } else { /* * 指令为Insert * 输入实部和虚部,并将复数存入到优先队列中 */ int real; int imag; scanf("%d+i%d", &real, &imag); myPriorityQueue.push(Complex(real, imag)); printf("SIZE = %d\n", myPriorityQueue.size()); } } return 0; }