• toc {:toc}

๋ฌธ์ œ

make-garden

๋„์‹œ์—๋Š” N ๊ฐœ์˜ ๋นŒ๋”ฉ์ด ์žˆ๋‹ค.

๋นŒ๋”ฉ ๊ด€๋ฆฌ์ธ๋“ค์€ ๋งค์šฐ ์„ฑ์‹ค ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋‹ค๋ฅธ ๋นŒ๋”ฉ์˜ ์˜ฅ์ƒ ์ •์›์„ ๋ฒค์น˜๋งˆํ‚น ํ•˜๊ณ  ์‹ถ์–ดํ•œ๋‹ค.

i ๋ฒˆ์งธ ๋นŒ๋”ฉ์˜ ํ‚ค๊ฐ€ hi ์ด๊ณ , ๋ชจ๋“  ๋นŒ๋”ฉ์€ ์ผ๋ ฌ๋กœ ์„œ ์žˆ๊ณ  ์˜ค๋ฅธ์ชฝ์œผ๋กœ๋งŒ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

i ๋ฒˆ์งธ ๋นŒ๋”ฉ ๊ด€๋ฆฌ์ธ์ด ๋ณผ ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ๋นŒ๋”ฉ์˜ ์˜ฅ์ƒ ์ •์›์€ i+1, i+2, โ€ฆ , N ์ด๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์ž์‹ ์ด ์œ„์น˜ํ•œ ๋นŒ๋”ฉ๋ณด๋‹ค ๋†’๊ฑฐ๋‚˜ ๊ฐ™์€ ๋นŒ๋”ฉ์ด ์žˆ์œผ๋ฉด ๊ทธ ๋‹ค์Œ์— ์žˆ๋Š” ๋ชจ๋“  ๋นŒ๋”ฉ์˜ ์˜ฅ์ƒ์€ ๋ณด์ง€ ๋ชปํ•œ๋‹ค.

์˜ˆ) N=6, H = {10, 3, 7, 4, 12, 2}์ธ ๊ฒฝ์šฐ

             =
 =           =
 =     -     =
 =     =     =        -> ๊ด€๋ฆฌ์ธ์ด ๋ณด๋Š” ๋ฐฉํ–ฅ
 =  -  =  =  =
 =  =  =  =  =  =
10  3  7  4  12 2     -> ๋นŒ๋”ฉ์˜ ๋†’์ด
[1][2][3][4][5][6]    -> ๋นŒ๋”ฉ์˜ ๋ฒˆํ˜ธ
  • 1 ๋ฒˆ ๊ด€๋ฆฌ์ธ์€ 2, 3, 4 ๋ฒˆ ๋นŒ๋”ฉ์˜ ์˜ฅ์ƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
  • 2 ๋ฒˆ ๊ด€๋ฆฌ์ธ์€ ๋‹ค๋ฅธ ๋นŒ๋”ฉ์˜ ์˜ฅ์ƒ์„ ํ™•์ธํ•  ์ˆ˜ ์—†๋‹ค.
  • 3 ๋ฒˆ ๊ด€๋ฆฌ์ธ์€ 4 ๋ฒˆ ๋นŒ๋”ฉ์˜ ์˜ฅ์ƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
  • 4 ๋ฒˆ ๊ด€๋ฆฌ์ธ์€ ๋‹ค๋ฅธ ๋นŒ๋”ฉ์˜ ์˜ฅ์ƒ์„ ํ™•์ธํ•  ์ˆ˜ ์—†๋‹ค.
  • 5 ๋ฒˆ ๊ด€๋ฆฌ์ธ์€ 6 ๋ฒˆ ๋นŒ๋”ฉ์˜ ์˜ฅ์ƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
  • 6 ๋ฒˆ ๊ด€๋ฆฌ์ธ์€ ๋งˆ์ง€๋ง‰์ด๋ฏ€๋กœ ๋‹ค๋ฅธ ๋นŒ๋”ฉ์˜ ์˜ฅ์ƒ์„ ํ™•์ธํ•  ์ˆ˜ ์—†๋‹ค.

๋”ฐ๋ผ์„œ, ๊ด€๋ฆฌ์ธ๋“ค์ด ์˜ฅ์ƒ์ •์›์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ์ด ์ˆ˜๋Š” 3 + 0 + 1 + 0 + 1 + 0 = 5 ์ด๋‹ค.

์ž…๋ ฅ

  • ์ฒซ ๋ฒˆ์งธ ์ค„์— ๋นŒ๋”ฉ์˜ย ๊ฐœ์ˆ˜ N ์ด ์ž…๋ ฅ๋œ๋‹ค.(1 โ‰ค N โ‰ค 80,000)
  • ๋‘ ๋ฒˆ์งธ ์ค„ ๋ถ€ํ„ฐ N+1 ๋ฒˆ์งธ ์ค„๊นŒ์ง€ ๊ฐ ๋นŒ๋”ฉ์˜ ๋†’์ด๊ฐ€ h ์ž…๋ ฅ๋œ๋‹ค. (1 โ‰ค h โ‰ค 1,000,000,000)

์ถœ๋ ฅ

  • ๊ฐ ๊ด€๋ฆฌ์ธ๋“ค์ด ๋ฒค์น˜๋งˆํ‚น์ด ๊ฐ€๋Šฅํ•œ ๋นŒ๋”ฉ์˜ ์ˆ˜์˜ ํ•ฉ์„ ์ถœ๋ ฅํ•œ๋‹ค.

์ถœ์ฒ˜:https://www.acmicpc.net/problem/6198

ํ’€์ด

๋‹ค์‹œ ํ’€์–ด๋ณด๊ธฐ

#include <bits/stdc++.h>
using namespace std;
 
#define ll long long
 
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    stack<int> s;
    int n;
    ll sum = 0, height;
    cin >> n;
    while(n--){
        cin >> height;
        if(s.empty()) s.push(height);
        else{
            while(!s.empty() && s.top() <= height){
                s.pop();
            }
            sum += s.size();
            s.push(height);
        }
    }
    cout << sum << endl;
 
    return 0;
}