z BOJ 3015. 오아시스 재결합 :: C++, 그래픽 기술 블로그

BOJ 3015. 오아시스 재결합

랭크 : 골드1

문제 풀이

들어올 때 top에 있는 것 보다 작으면 쌓고, 아니면 작은 것이 나올 때까지 치우는 식으로 진행하였습니다. 수를 셀 때 여러가지 상황을 고려하였는데, 좀더 쉽게 코드를 짤 수 있을 것 같은데 너무 귀찮습니다... 세그먼트 트리를 쓰는 방법도 존재하는 것 같습니다. 중요 포인트는 같은 값이 들어왔을 때입니다.

#include <bits/stdc++.h>
#define fastio cin.tie(0)->sync_with_stdio(0)

using namespace std;

long long N, tmp, total, num, pos;

int main() {
    fastio;
    cin >> N;
    total = 0;
    vector<pair<long long, int>> arr(500'000, {0, 1});
    int seeing;
    cin >> tmp;
    pos++;
    arr[0].first = tmp;
    while (--N) {
        cin >> tmp;
        seeing = 0;
        while (pos != 0 && (arr[pos - 1].first < tmp)) {
            seeing += arr[pos - 1].second;
            pos--;
        }
        if (pos != 0 && arr[pos - 1].first == tmp) {
            total += seeing + arr[pos - 1].second;
            arr[pos - 1].second++;
            if (pos != 1) total++;
            continue;
        }
        if (pos) seeing++;
        total += seeing;
        arr[pos].first = tmp;
        arr[pos].second = 1;
        pos++;
    }
    cout << total << endl;
}


알고리즘 시간복잡도 공간복잡도
자료 구조 스택 $O(N)$ $O(N)$



'알고리즘 > 백준' 카테고리의 다른 글

BOJ 11054. 가장 긴 바이토닉 부분 수열  (0) 2022.07.17
BOJ 2293. 동전 1  (0) 2022.07.16
BOJ 2629. 양팔저울  (0) 2022.07.15
BOJ 11066. 파일 합치기  (0) 2022.07.15
BOJ 1520. 내리막 길  (0) 2022.07.15

+ Recent posts