N(1 โค N โค 100,000)๊ฐ์ ์ ์๋ค์ด ์์ ๋, a๋ฒ์งธ ์ ์๋ถํฐ b๋ฒ์งธย ์ ์๊น์ง ์ค์์ ์ ์ผ ์์ ์ ์, ๋๋ ์ ์ผ ํฐ ์ ์๋ฅผ ์ฐพ๋ ๊ฒ์ ์ด๋ ค์ด ์ผ์ด ์๋๋ค.ย ํ์ง๋ง ์ด์ ๊ฐ์ a, b์ ์์ด M(1 โค M โค 100,000)๊ฐ ์ฃผ์ด์ก์ ๋๋ ์ด๋ ค์ด ๋ฌธ์ ๊ฐ ๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํดย ๋ณด์.
์ฌ๊ธฐ์ a๋ฒ์งธ๋ผ๋ ๊ฒ์ ์ ๋ ฅ๋๋ ์์๋ก a๋ฒ์งธ๋ผ๋ ์ด์ผ๊ธฐ์ด๋ค. ์๋ฅผ ๋ค์ด a=1, b=3์ด๋ผ๋ฉด ์ ๋ ฅ๋ ์์๋๋ก 1๋ฒ, 2๋ฒ, 3๋ฒ ์ ์ ์ค์์ ์ต์, ์ต๋๊ฐ์ ์ฐพ์์ผ ํ๋ค. ๊ฐ๊ฐ์ ์ ์๋ค์ 1์ด์ 1,000,000,000์ดํ์ ๊ฐ์ ๊ฐ๋๋ค.
10 4
75
30
100
38
50
51
52
20
81
5
1 10
3 5
6 9
8 10
์ฒซ์งธ ์ค์ N, M์ด ์ฃผ์ด์ง๋ค. ๋ค์ N๊ฐ์ ์ค์๋ N๊ฐ์ ์ ์๊ฐ ์ฃผ์ด์ง๋ค. ๋ค์ M๊ฐ์ ์ค์๋ a, b์ ์์ด ์ฃผ์ด์ง๋ค.
M๊ฐ์ ์ค์ ์ ๋ ฅ๋ฐ์ ์์๋๋ก ๊ฐ a, b์ ๋ํ ๋ต์ ์ต์๊ฐ, ์ต๋๊ฐ ์์๋ก ์ถ๋ ฅํ๋ค.
5 100
38 100
20 81
5 81
์ธ๊ทธ๋จผํธ ํธ๋ฆฌ๋ฅผ ๊ณต๋ถํ๋ค๊ฐ ์ดํด๋ ๋๋๋ฐ ๊ตฌํ์ด ์ ์ ๋์ด์ ์คํ์ค ํ ์ด๋ธ์ ์ฐ๊ฒ ๋์์ต๋๋ค.

MAX, MIN, GCD๋ฅผ O(1)์ ์ฟผ๋ฆฌ ๊ฐ๋ฅ
์กฐ๊ฑด 1. arr์ ์ ์ฅ๋ ๊ฐ์ด ๋ณํ์ง ์๋๋ค.
์กฐ๊ฑด 2. f(a, b, c) = f(a, (b, c)) = f(f(a, b),c)๋ก ๊ฒฐํฉ ๋ฒ์น์ด ์ฑ๋ฆฝํ๋ค.
๋ฐฐ์ด arr์ f ์ฟผ๋ฆฌ๊ฐ ์ ์กฐ๊ฑด์ ๋ง์กฑํ ๋ ์ฟผ๋ฆฌ๋ฅผย O(lgN)ย ๋ง์ ์ฒ๋ฆฌํ ์ ์๋ ์๋ฃ ๊ตฌ์กฐ
์คํ์ค ํ ์ด๋ธ(Sparse Table)๊ณผ ์ธ๊ทธ๋จผํธ ํธ๋ฆฌ(Segment Tree)๋ ๋ฒ์ ์ฟผ๋ฆฌ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ ์๋ฃ๊ตฌ์กฐ์ ๋๋ค. ์ด ๋์ ์๋ก ๋ค๋ฅธ ํน์ฑ๊ณผ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์๋ ํ๋ ์ด ๋ ์๋ฃ๊ตฌ์กฐ์ ์ฃผ์ ์ฐจ์ด์ ์ ์ ๋ฆฌํ ๊ฒ์ ๋๋ค.
| ๊ตฌ๋ถ | ์คํ์ค ํ ์ด๋ธ | ์ธ๊ทธ๋จผํธ ํธ๋ฆฌ |
|---|---|---|
| ์ ์ | ๊ตฌ๊ฐ์ ๋ํ ๊ฒฐ๊ณผ๋ฅผ ๋ฏธ๋ฆฌ ๊ณ์ฐํด ๋์ด ๋น ๋ฅธ ์ฟผ๋ฆฌ ์ํ์ ๊ฐ๋ฅํ๊ฒ ํ๋ ์๋ฃ๊ตฌ์กฐ. ์ฃผ๋ก ๋ถ๋ณ์ ๋ฐ์ดํฐ์ ์ฌ์ฉ๋จ. | ํธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌ๊ฐ์ ๋ํ ์ฟผ๋ฆฌ์ ์ ๋ฐ์ดํธ๋ฅผ ์ง์ํ๋ ์๋ฃ๊ตฌ์กฐ. ๋ณ๊ฒฝ ๊ฐ๋ฅํ ๋ฐ์ดํฐ์ ์ฌ์ฉ๋จ. |
| ์๊ฐ ๋ณต์ก๋ (์ฟผ๋ฆฌ) | O(1) ๋๋ O(logN) | |
| (๋ฉฑ๋ฑ๋ฒ์น+๊ตํ๋ฒ์น์ด ์ถ๊ฐ๋ก ์ฑ๋ฆฝํ๋ฉดO(1)) | O(logN) | |
| ์๊ฐ ๋ณต์ก๋ (๊ตฌ์ถ) | O(NlogN) | O(N) |
| ์๊ฐ ๋ณต์ก๋ (์ ๋ฐ์ดํธ) | ์ ๋ฐ์ดํธ ๋ถ๊ฐ | |
| (๋ถ๋ณ์ ๋ฐ์ดํฐ์ ์ฌ์ฉ) | O(logN) | |
| ์ฌ์ฉ ์ฌ๋ก | ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋์ง ์๊ณ , ์ต์๊ฐ, ์ต๋๊ฐ, ์ต๋ ๊ณต์ฝ์ ๋ฑ ๊ฒฐํฉ๋ฒ์น์ด ์ฑ๋ฆฝํ๋ ์ดํญ์ฐ์ฐ์ ๋ํ ์ฟผ๋ฆฌ๋ฅผ ๋น ๋ฅด๊ฒ ์ฒ๋ฆฌํด์ผ ํ ๋ ์ฌ์ฉ. | ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋ ์ ์์ผ๋ฉฐ, ๊ตฌ๊ฐ ํฉ, ๊ตฌ๊ฐ ์ต์๊ฐ, ๊ตฌ๊ฐ ์ต๋๊ฐ ๋ฑ์ ๊ตฌํ ๋ ์ฌ์ฉ. |
| ์ฅ์ | ๊ตฌ๊ฐ ์ฟผ๋ฆฌ๋ฅผ ๋งค์ฐ ๋น ๋ฅด๊ฒ ์ฒ๋ฆฌํ ์ ์์. | ๋ฐ์ดํฐ ์ ๋ฐ์ดํธ๊ฐ ๊ฐ๋ฅํ๋ฉฐ, ๋ค์ํ ๋ฒ์ ์ฟผ๋ฆฌ๋ฅผ ์ฒ๋ฆฌํ ์ ์์. |
| ๋จ์ | ๋ฐ์ดํฐ๋ฅผ ์ ๋ฐ์ดํธํ ์ ์์. | ์ฟผ๋ฆฌ ์ฒ๋ฆฌ๊ฐ ์คํ์ค ํ ์ด๋ธ์ ๋นํด ์๋์ ์ผ๋ก ๋๋ฆด ์ ์์. |
class ST:
def __init__(self, data, func):
self.n = len(data)
self.K = math.ceil(math.log2(self.n))
self.t = [[0] * (self.K + 1) for _ in range(self.n)]
self.func = func
self.build(data)
def build(self, data):
for i in range(self.n):
self.t[i][0] = data[i]
for j in range(1, self.K + 1):
for i in range(self.n - (1 << j) + 1):
self.t[i][j] = self.func(self.t[i][j-1], self.t[i + (1 << (j-1))][j-1])
def qry(self, L, R):
j = int(math.log2(R - L + 1))
return self.func(self.t[L][j], self.t[R - (1 << j) + 1][j])
์ ์ฝ๋๋ ์คํ์ค ํ ์ด๋ธ(Sparse Table)์ ๊ตฌํํ ๊ฒ์ ๋๋ค.
class ST:**์ด ํด๋์ค๋ ์คํ์ค ํ
์ด๋ธ์ ๊ตฌํํฉ๋๋ค.