์์ ์ ์คํ์ผ๋ก ํ ์ ์๋ค๋ ์ด์ผ๊ธฐ๋ง ๋ฃ๊ณ ๋ฎ์ด๋จ์๋ ๋ฌธ์ . ๋ค์ด์๋ชฌ๋ ๊ฐ๊ณต ๋ฌธ์ ์์ ์ต๋ ๋ฉด์ ์ ๋น ๋ฅด๊ฒ ๊ตฌํด์ผํ ํ์๊ฐ ์์ด์ ๋ค์ ๊บผ๋ด ํ์ด๋ณด์๋ค.
(์ฌ๋ด์ด์ง๋ง, ๋ฐฑ์ค์ ๋ค์ํ ๋ฌธ์ ๋ฅผ ํ ์ ์์ด์ ์ข์๋ฏ.. ์ด๋ฐ ์๋น์ค๊ฐ ํ๊ตญ์ ์์ด์ ๋ถ๋ช ํ๊ตญ์ SW ๊ฒฝ์๋ ฅ์ ๋ํ๋ค๊ณ ์๊ฐ.)
SegTree๋ ๋ถํ ์ ๋ณต์ผ๋ก O(n*log n)
์ด ๊ฑธ๋ฆฌ๋ ์๊ฐ๋ณต์ก๋๋ฅผ O(n)
์ผ๋ก ์ค์ผ ์ ์๋ ํ๊ธฐ์ ์ธ ์์ด๋์ด.
์คํ์๋ ํญ์ ์ฆ๊ฐํ๋ ์์๋ก height ๋ค์ด ๋ค์ด๊ฐ ์์ผ๋ฏ๋ก, pop ํ ์ดํ idx.top()
์ ํ๊ฒ๋๋ฉด, ์ต๋ width๊ฐ ๋์จ๋ค. ์ด ๋ถ๋ถ์ด ํต์ฌ ์์ด๋์ด.
์ ์ฒด ์ฝ๋๋ ์๋์ ๊ฐ๋ค.
void solve() {for (rint i = 1; i <= N; ++i) {scanf("%d", &A[i]);}A[0] = A[N+1] = 0;stack<int> idx;idx.push(0);ll maxArea = 0;for(rint i = 1; i <= N + 1; ++i) { // N + 1, ๋ง์ง๋ง fake ์์๋ก ๋๋ด๊ธฐ ์ํจ_D("checking A[%d] = %d\n", i, A[i]);while(idx.size() && A[idx.top()] > A[i]) {int c = idx.top(); idx.pop(); // ๋ ์์ผ๋ฉด popํ๋ค.ll w = i - idx.top() - 1; // c - i๊ฐ ์๋์ ์ ์! **์๊ธฐ๋ณด๋ค ๋ ์์ ์ ๊ฐ ์๋ ๊ณณ๊น์ง..ll h = A[c];ll area = w * h;_D("area: %lld\n", area);if (area > maxArea) maxArea = area;}idx.push(i); // ์ ๊ท ์์ push}printf("%lld\n", maxArea);}