1927

1927

Created at : 2023-10-19 14:41
1927

#include <iostream>
#include <vector>
#define SWAP(x,y,temp) temp = x; x = y; y = temp;

using namespace std;

class Heap
{
public:
    Heap():
        mIndex(1)
    {
        mNodes.resize(10);
    }

    void Insert(uint32_t Value)
    {
        if(mNodes.size() <= mIndex)
        {
            Resize(mNodes.size() * 2);
        }
        uint32_t i = mIndex;
        ++mIndex;
        mNodes[i] = Value;
        while(i > 1)
        {
            if(CompareFunc(mNodes[i/2], mNodes[i])){ break; }
            uint32_t Temp = mNodes[i];
            SWAP(mNodes[i], mNodes[i/2], Temp);
            i /= 2;
        }
    }
    uint32_t Remove()
    {
        if(mIndex == 1) return 0;
        uint32_t Removed = mNodes[1], Temp = mNodes[mIndex - 1];
        uint32_t Parent = 1, Child = 2;
        --mIndex;
        while (Child < mIndex)
        {
            if(Child + 1 < mIndex && CompareFunc(mNodes[Child+1], mNodes[Child])) 
            { 
                ++Child;
            }
            if(CompareFunc(Temp, mNodes[Child]))
            {
                break;
            }
            mNodes[Parent] = mNodes[Child];
            Parent = Child;
            Child *= 2;
        }
        mNodes[Parent] = Temp;
        
        return Removed;
    }
    void Resize(uint32_t Size)
    {
        mNodes.resize(Size);
    }
    bool CompareFunc(uint32_t a, uint32_t b)
    {
        return a < b;
    }
    void Print()
    {
        cout << '\t';
        for(uint32_t i = 1; i < mIndex; ++i)
        {
            cout << mNodes[i] << ", ";
        }
        cout << endl;
    }

private:
    vector<uint32_t> mNodes;
    uint32_t mIndex;
    
public:
    inline uint32_t GetSize() const { return mIndex - 1; }
};

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);

    uint32_t n;
    Heap MinHeap;

    cin >> n;

    for(uint32_t i = 0; i < n;  ++i)
    {
        uint32_t Input;
        cin >> Input;
        if(Input == 0)
        {
            cout << MinHeap.Remove() << "\n";
        }
        else
        {
            MinHeap.Insert(Input);
        }
        // MinHeap.Print();
    }

    return 0;
}

흔한 힙문제. 다만 자료구조를 배운지 오래되서 그런가 힙이 무엇인지부터 생각이 안났다...
힙은 다시한번 공부해 보도록 하자.