#include <iostream> #include <stack> #include <vector> using namespace std; int arr[80005]; int main() { ios::sync_with_stdio(0); cin.tie(0); int N,max=0,input; long long cnt=0; stack<int> S; cin >> N; for(int i=0;i<N;i++) cin >> arr[i]; for(int i=0;i<N;i++) { while(!S.empty() && S.top() <= arr[i]) { S.pop(); } S.push(arr[i]); cnt += S.size()-1; } cout << cnt; }
- 풀이를 참고함;
- 스택을 사용
- cnt가 80,000 까지 내림차순 합이 될 경우 숫자가 매우 커지므로 long long을 사용해야 한다.
- S.top() > arr[i] 이 되어야 내려다볼 수 있기 때문에 cnt를 증가시킬 수 있다. 이 조건이 될 떄 까지 S.pop()
- 그리고 나서 cnt += S.size()-1 해주어야 해당 빌딩을 위에서 볼 수 있는 건물의 수를 구할 수 있음
- 나중에 다시 풀어봐야 할 듯