페이지

1927번: 최소 힙

https://www.acmicpc.net/problem/1927


#include<stdio.h>
int N, x, data[200010], cnt, ans[100001], anscnt;
void in()
{
    int pos, tmp;
    data[++cnt] = x;
    pos = cnt / 2;
    while (pos != 0)
    {
        if (data[pos]>data[pos * 2] && (data[pos * 2]<data[pos * 2 + 1] || data[pos * 2 + 1] == 0))
        {
            tmp = data[pos * 2];
            data[pos * 2] = data[pos];
            data[pos] = tmp;
        }
        else if (data[pos]>data[pos * 2 + 1] && data[pos * 2 + 1] != 0)
        {
            tmp = data[pos * 2 + 1];
            data[pos * 2 + 1] = data[pos];
            data[pos] = tmp;
        }
        else
        {
            return;
        }
        pos /= 2;
    }
}
void out()
{
    int pos = 1, tmp;
    if (cnt == 0)
    {
        ans[++anscnt] = 0;
    }
    else
    {
        ans[++anscnt] = data[1];
        data[1] = data[cnt];
        data[cnt--] = 0;
        while (data[pos * 2] != 0)
        {
            if (data[pos]>data[pos * 2] && (data[pos * 2]<data[pos * 2 + 1] || data[pos * 2 + 1] == 0))
            {
                tmp = data[pos];
                data[pos] = data[pos * 2];
                data[pos * 2] = tmp;
                pos *= 2;
            }
            else if (data[pos]>data[pos * 2 + 1] && data[pos * 2 + 1] != 0)
            {
                tmp = data[pos];
                data[pos] = data[pos * 2 + 1];
                data[pos * 2 + 1] = tmp;
                pos = pos * 2 + 1;
            }
            else
            {
                return;
            }
        }
    }
}
int main()
{
    int i;
    scanf("%d", &N);
    for (i = 1; i <= N; i++)
    {
        scanf("%d", &x);
        if (x == 0)
        {
            out();
        }
        else
        {
            in();
        }
    }
    for (i = 1; i <= anscnt; i++)
    {
        printf("%d\n", ans[i]);
    }
    return 0;
}

댓글 없음 :

댓글 쓰기