์ตœ์†Ÿ๊ฐ’๊ณผ ์ตœ๋Œ“๊ฐ’

๋ฌธ์ œ

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์ดํ•˜์˜ ๊ฐ’์„ ๊ฐ–๋Š”๋‹ค.


์˜ˆ์ œ ์ž…๋ ฅ 1

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์— ๋Œ€ํ•œ ๋‹ต์„ ์ตœ์†Ÿ๊ฐ’, ์ตœ๋Œ“๊ฐ’ ์ˆœ์„œ๋กœ ์ถœ๋ ฅํ•œ๋‹ค.

์˜ˆ์ œ ์ถœ๋ ฅ 1

5 100
38 100
20 81
5 81

์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ๋ฅผ ๊ณต๋ถ€ํ•˜๋‹ค๊ฐ€ ์ดํ•ด๋Š” ๋˜๋Š”๋ฐ ๊ตฌํ˜„์ด ์ž˜ ์•ˆ ๋˜์–ด์„œ ์ŠคํŒŒ์Šค ํ…Œ์ด๋ธ”์„ ์“ฐ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Sparse Table

Untitled

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)์„ ๊ตฌํ˜„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  1. **class ST:**์ด ํด๋ž˜์Šค๋Š” ์ŠคํŒŒ์Šค ํ…Œ์ด๋ธ”์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.