[백준 17435] 합성함수와 쿼리 (파이썬 / Python)
포스트
취소

[백준 17435] 합성함수와 쿼리 (파이썬 / Python)


📑 문제

문제링크 : 합성함수와 쿼리


🤔 생각의 흐름

얼마 전에 알게된 희소 배열 알고리즘을 써야겠다고 생각했습니다. ‘희소 배열이 뭐지?’ 하시는 분들은 이 글을 보고 와주세요.


🎯 풀이방법

희소 배열 문제이며, 시간복잡도는 $O((m + Q) \log N)$ 입니다.

move[i][j] : j 번 노드가 $2^i$ 번 이동했을 때의 위치

  1. 희소 배열 알고리즘을 위한 전처리를 해줍니다.

  2. 입력받은 쿼리를 전처리한 리스트를 이용하여 구합니다.


🔎 유의할 점

  • 희소 배열 알고리즘을 이해하고 푼다면 크게 유의할 점은 없습니다.

💻 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
from sys import stdin

input = stdin.readline


def solve():
    m = int(input())

    # log2(500_000) + 1 = 19
    length = 19

    # move[i][j]: f_2^i(j)
    move = [[0] * (m + 1) for _ in range(length)]
    move[0][1:m+1] = [*map(int, input().split())]

    for i in range(1, length):
        for j in range(1, m + 1):
            move[i][j] = move[i-1][move[i-1][j]]

    Q = int(input())
    for _ in range(Q):
        n, x = map(int, input().split())
        idx = 0
        while (1 << idx) <= n:
            if n & (1 << idx):
                x = move[idx][x]
            idx += 1
        print(x)


if __name__ == '__main__':
    solve()
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.

[알고리즘] 희소 배열(Sparse Table) 알고리즘

[백준 18809] Gaaaaaaaaaarden (파이썬 / Python)

Comments powered by Disqus.