[BOJ] 17435번 합성함수와 쿼리 - Python

"최소 공통 조상"

Posted by Yongmin on October 12, 2021

문제

합성함수와 쿼리

풀이

sparse table을 이용한 문제이다. 기존 o(n)의 시간복잡도에서 o(log2(n))으로 시간복잡도를 줄여 정답을 도출하는 문제이다.
f1(x), f2(x), f4(x)… f2^(n)(x)의 값들을 dp를 통해 저장해놓는다. 이 때 점화식은 dp[i][x] = dp[i-1][dp[i-1][x]]이다.
그 이후, n을 n을 넘지 않는 가장 큰 2의 진수들로 계산해나가며 정답을 도출해낸다.

소스 코드

```python import sys from math import *

m = int(sys.stdin.readline()) # m = 5

func = [0] + list(map(int, sys.stdin.readline().split()))

dp = [[0 for i in range(m+1)] for j in range(19)]

for i in range(1, m+1): dp[0][i] = func[i]

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

q = int(sys.stdin.readline())

for _ in range(q): n, x = map(int, sys.stdin.readline().split())

1
2
3
4
5
6
for j in range(18, -1, -1):
    if(n >= 1 << j):
        n -= 1 << j
        x = dp[j][x]

print(x)

#log2(200000) = 17.6

1
```


# # #