BOJ 6549 (์ง์‚ฌ๊ฐํ˜• ์ตœ๋Œ€ ๋„“์ด ๊ตฌํ•˜๊ธฐ)
ย - Last update: 2023-05-10

์˜ˆ์ „์— ์Šคํƒ์œผ๋กœ ํ’€ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ด์•ผ๊ธฐ๋งŒ ๋“ฃ๊ณ  ๋ฎ์–ด๋†จ์—ˆ๋˜ ๋ฌธ์ œ. ๋‹ค์ด์•„๋ชฌ๋“œ ๊ฐ€๊ณต ๋ฌธ์ œ์—์„œ ์ตœ๋Œ€ ๋ฉด์ ์„ ๋น ๋ฅด๊ฒŒ ๊ตฌํ•ด์•ผํ•  ํ•„์š”๊ฐ€ ์žˆ์–ด์„œ ๋‹ค์‹œ ๊บผ๋‚ด ํ’€์–ด๋ณด์•˜๋‹ค.

(์‚ฌ๋‹ด์ด์ง€๋งŒ, ๋ฐฑ์ค€์€ ๋‹ค์–‘ํ•œ ๋ฌธ์ œ๋ฅผ ํ’€ ์ˆ˜ ์žˆ์–ด์„œ ์ข‹์€๋“ฏ.. ์ด๋Ÿฐ ์„œ๋น„์Šค๊ฐ€ ํ•œ๊ตญ์— ์žˆ์–ด์„œ ๋ถ„๋ช… ํ•œ๊ตญ์˜ 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);
}
๐Ÿท๏ธ ์ฃผ์ œ ๋ชฉ๋ก: