백준 11286번 : 절댓값 힙 / C++

2023. 3. 12. 19:58개인공부/코딩테스트

11286번: 절댓값 힙 (acmicpc.net)

 

11286번: 절댓값 힙

첫째 줄에 연산의 개수 N(1≤N≤100,000)이 주어진다. 다음 N개의 줄에는 연산에 대한 정보를 나타내는 정수 x가 주어진다. 만약 x가 0이 아니라면 배열에 x라는 값을 넣는(추가하는) 연산이고, x가 0

www.acmicpc.net

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
 
#include <iostream>
#include <set>
using namespace std;
 
struct Abs
{
    int num;
    char IsPositive; // 1:양수 0: 음수 
 
 
 
    bool operator <(const Abs& _other)const
    {
        if (num < _other.num)
            return true;
        else if (num > _other.num)
            return false;
        else if (IsPositive < _other.IsPositive)
            return true;
        else
            return false;
    }
};
 
 
int main()
    cin.tie(NULL);
    cout.tie(NULL);
    ios::sync_with_stdio(false);
 
    multiset<Abs> S;
 
    int N;
    cin >> N;
    for (int i = 0; i < N; ++i)
    {
        int num;
        cin >> num;
        if (num != 0)
        {
            Abs a;
            a.num = abs(num);
            if (num > 0)
                a.IsPositive = 1;
            else
                a.IsPositive = 0;
 
            S.insert(a);
        }
        else
        {
            if (S.empty())
                cout << 0 << '\n';
            else
            {
                auto iter =S.begin();
                int num = iter->num;
                if (iter->IsPositive == 0)
                    num *= -1;
                cout << num << '\n';
                S.erase(iter);
            }
 
        }
    }
    return 0;
}
 
 
cs