Notice
Recent Posts
Recent Comments
«   2024/11   »
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
Archives
Today
Total
관리 메뉴

블로그 언저리인 무언가

[백준/BOJ] 13146 같은 수로 만들기 2 본문

Programming/BOJ

[백준/BOJ] 13146 같은 수로 만들기 2

he1fire 2022. 9. 16. 10:29
728x90

문제 : 13146 같은 수로 만들기 2

 

13146번: 같은 수로 만들기 2

n(1 ≤ n ≤ 1,000,000)개의 자연수 A[1], A[2], A[3], …, A[n]이 있다. 이 자연수에 Add(i)라는 연산을 하면, A[i]가 1만큼 증가한다. 이때, A[i]만 증가하는 것이 아니고, A[i]의 좌우로 인접한 같은 수의 그룹이

www.acmicpc.net

단순하게 생각했을때 배열이 오름차순 or 내림차순으로 정렬되어 있다면

abs(arr[0]-arr[N-1])번만 add()연산을 실행해주면 된다.

 

따라서 배열에 수가 들어올 때 마다 배열을 내림차순 수열로 만들어준다고 생각하면

현재 들어온 M번째 수가 이전보다 작은수라면 냅두고

큰수라면 현재까지 저장된 수열들을 M번째 수와 같게 만들어주면 다시 내림차순 수열로 저장할 수 있다.

이때 같게 만들기 위해서는 이미 앞부분이 내림차순 수열이므로 arr[M]-arr[M-1]번만 add()연산을 해주면 된다. 


Code

#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll N, ans;
deque<ll> dq;
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> N;
    while (N--){
        ll x;
        cin >> x;
        if (!dq.empty() && dq.back()<x){ // 내림차순이 아니라면
            ll y=dq.back();
            ans+=x-y; // 차이나는만큼 더하는 행동 실행
            while (!dq.empty() && dq.back()<x) // 다 같아졌으므로 앞의 원소들 제거하기
                dq.pop_back();
        }
        dq.push_back(x);
    }
    cout << ans+dq.front()-dq.back(); // 지금까지 증가시킨 횟수 + 내림차순일때 횟수
    return 0;
}
728x90

'Programming > BOJ' 카테고리의 다른 글

[백준/BOJ] 25201 보드 뒤집기 게임  (1) 2022.09.16
[백준/BOJ] 23034 조별과제 멈춰!  (0) 2022.09.16
[백준/BOJ] 10165 버스 노선  (0) 2022.09.16
[백준/BOJ] 2873 롤러코스터  (0) 2021.09.20
[백준/BOJ] 20041 Escaping  (0) 2021.09.18
Comments