백준17421 빗물이 넘쳐흘러 작성일 2019-11-21 | In Sunrin-PS 문제 링크 http://icpc.me/17421 문제 출처 2019 선린 정올 3번 사용 알고리즘 Monotone Stack 시간복잡도 O(N) 풀이 스택으로 각 웅덩이(?)를 monotone하게 관리해주면 O(N)에 풀 수 있습니다. 전체 코드 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849#include <bits/stdc++.h> using namespace std; typedef long long ll; struct asdf{ int l, r, h, v; asdf(){} asdf(int l, int r, int h, int v) : l(l), r(r), h(h), v(v) {} }; int n, k; ll arr[101010]; vector<asdf> stk; int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cin >> n >> k; ll ans = 0, cnt = 0; for(int i=1; i<=n+1; i++){ if(i != n + 1) cin >> arr[i]; int l = i, flag = 0, remain = 0; while(stk.size() && stk.back().h >= arr[i]){ l = stk.back().l; ll val = stk.back().h - arr[i]; if(stk.back().h == arr[i]){ remain += stk.back().v; }else{ if(!flag){ cnt++; flag = 1; remain++; } cnt -= stk.back().v; } if(cnt == k){ cout << ans; return 0; } ans += val * (stk.back().r - stk.back().l + 1); stk.pop_back(); } stk.push_back({l, i, arr[i], remain}); } cout << -1; }