这道题可以用堆实现,不过利用优先队列是更简单的方法(实际上,优先队列的底层实现就是二叉堆),需要注意结构体的比较符号的重载,下面的代码里给出了重载的两种方式:

#include<iostream>
#include<cstdio>
#include<queue>
#include<stdio.h>
#include<string>

using namespace std;

struct Complex
{
    int x,y;
    Complex(int x,int y):x(x),y(y){}
    //重载比较符号
    friend bool operator <(Complex a,Complex b)
    {
        if(a.x*a.x+a.y*a.y==b.x*b.x+b.y*b.y)
        {
            return a.y>b.y;
        }
        else 
            return a.x*a.x+a.y*a.y<b.x*b.x+b.y*b.y; //正常排序,值越大的排的越靠前
    }
    /*
    //这种形式的重载也是可以的
    bool operator<(Complex c)const{
        return x*x+y*y<c.x*+c.x+c.y*c.y;
    }
    */
};
priority_queue<Complex> q;
void Pop()
{
    if(q.empty())
    {
        cout<<"empty "<<endl;
        return;
    }
    else
    {
        Complex c=q.top();
        cout<<c.x<<"+i"<<c.y<<endl;
        q.pop();
        cout<<"SIZE = "<<q.size()<<endl;
    }
    return;
}

void Insert(int a,int b)
{
    Complex c=Complex(a,b);
    q.push(c);
    cout<<"SIZE = "<<q.size()<<endl;
    return;
}

int main()
{
    int n,x,y;
    char str2[1001]={};
    string str;
    while(cin>>n)
    {
        while(!q.empty())
            q.pop();
        for(int i=0;i<n;i++)
        {
            //读取指令
            cin>>str;
            if(str=="Pop")
                Pop();
            else if(str=="Insert")
            {
                scanf("%d+i%d",&x,&y);
                Insert(x,y);
            }
        }
    }
    return 0;
}