https://www.acmicpc.net/problem/3015
아이디어:
1. 스택의 내림차순 유지
2. 같은 키에 대한 처리가 핵심
3. 스택에 들어가는 값은 { tmp, cnt } 로 cnt는 "스택 내에서 같은 키를 가진 사람 수"
4. 같은 키 n명에 대해 등차수열의 합 n*(n+1)/2 생각해보면 정답 변수 ans는 int형이 아닌 long long형으로 정의해야한다.
추가 예제:
7 2 4 1 2 2 5 1 (정답: 10)
5 5 5 2 2 5 (정답: 8)
스택에 내림차순 적용하는 방식은 똑같다.
cnt는 기본 1이다.
내림차순 유지를 위해 pop()을 할 때, (tmp <= S.top().first)
정답 ans에 top()의 cnt (키 같은 사람 수)를 더해준다.
만약 새로 들어온 수와 top()의 키가 같다면 cnt는 그만큼 더해준다.
스택에 수가 있다면 top()과 tmp는 서로 볼 수 있으므로
스택이 비어있지 않을 때 ans++
스택이 내림차순이므로 스택 내부의 top()보다 큰 요소들은 볼 필요가 없다.
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n, tmp;
stack<pair<int, int>> S;
long long ans = 0;
cin >> n;
while (n--) {
cin >> tmp;
int cnt = 1;
while (!S.empty() && S.top().first <= tmp) {
ans += S.top().second;
if (S.top().first == tmp) cnt += S.top().second;
S.pop();
}
if (!S.empty()) ans++;
S.push({ tmp, cnt });
}
cout << ans;
return 0;
}
'algorithm' 카테고리의 다른 글
큐 (0) | 2025.03.29 |
---|---|
백준 6549번 히스토그램에서 가장 큰 직사각형 (0) | 2025.03.29 |
백준 17298번 오큰수 (1) | 2025.03.04 |
백준 6198번 옥상 정원 꾸미기 - 모노톤 스택 (0) | 2025.03.02 |
백준 2504번 괄호의 값 (0) | 2025.03.02 |