L2-2 關於堆的判斷

比賽的時候不知道小頂堆的概念,也不會手打堆,真實自閉。。
其實就是一道最小堆的模板題,套套板子就出來了。不過沒法提交,也不知道能不能拿滿。過兩天開一場重現賽試試
最小堆(小頂堆):父節點的值比他的兩個子節點的值都要小的堆


#include <iostream>
using namespace std;
int heap[10000],sz=0,n;
void push(int x)//向堆中插入x
{
    int i=sz++;
    while(i>0)
    {
        int p=(i-1)/2;
        if(heap[p]<=x)
            break;
        heap[i]=heap[p];
        i=p;
    }
    heap[i]=x;
}

int pop()
{
    int ret=heap[0];
    int x=heap[--sz];
    int i=0;
    while(i*2+1<sz)
    {
        int a=i*2+1,b=i*2+2;
        if(heap[b]<sz&&heap[b]<heap[a])
            a=b;
        if(heap[a]>=x)
            break;
        heap[i]=heap[a];
        i=a;
    }
    heap[i]=x;
    heap[sz]=0;
    return ret;
}

int findd(int x)//查找x在堆中的位置
{
    for(int i=0; i<n; i++)
    {
        if(heap[i]==x)
            return i;
    }
}

void isroot(int x)//判斷x是否爲根
{
    if(heap[0]==x)
        cout<<"T"<<endl;
    else
        cout<<"F"<<endl;
}

void parent(int a,int b)//判斷a是否是b的父節點
{
    int i=findd(a);
    if(heap[i*2+1]==b||heap[i*2+2]==b)
        cout<<"T"<<endl;
    else
        cout<<"F"<<endl;
}

void brother(int a,int b)//判斷a,b是否是兄弟節點
{
    int i=findd(a);
    if(i%2==0&&heap[i-1]==b)
        cout<<"T"<<endl;
    else if(i%2!=0&&heap[i+1]==b)
        cout<<"T"<<endl;
    else
        cout<<"F"<<endl;
}


int main()
{
    int m;
    cin>>n>>m;
    int i=0;
    while(i++<n)
    {
        int a;
        cin>>a;
        push(a);
    }
    while(m--)
    {
        int a,b;
        string c;
        cin>>a>>c;
        if(c=="and")
        {
            cin>>b;
            cin>>c>>c;
            brother(a,b);
        }
        else
        {
            cin>>c;
            if(c=="a")
            {
                cin>>c>>c>>b;
                parent(b,a);//判斷a是否是b的子節點等價於判斷b是否是a的父節點
            }
            else
            {
                cin>>c;
                if(c=="root")
                    isroot(a);
                else
                {
                    cin>>c>>b;
                    parent(a,b);
                }
            }
        }
    }
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章