https://www.acmicpc.net/problem/14427
14427번: 수열과 쿼리 15
길이가 N인 수열 A1, A2, ..., AN이 주어진다. 이때, 다음 쿼리를 수행하는 프로그램을 작성하시오. 1 i v : Ai를 v로 바꾼다. (1 ≤ i ≤ N, 1 ≤ v ≤ 109) 2 : 수열에서 크기가 가장 작은 값의 인덱스를
www.acmicpc.net
문제 접근
세그먼트 트리를 이용해서 풀었다.
세그먼트 트리는 구간합을 구하는 문제에서 쓰이지만 아래의 leaf노드가 아닌 다른 노드에는 구간합을 적어두는 방식으로 사용한다.
이 문제에선 구간합이 아닌 최소값을 비교해서 더작은 값을 적어두는 방식으로 진행했고 루트노드에 최소값을 적어두는것으로 해결했다.
세그트리는 다양하게 쓰이는듯 하다.
세그트리를 어떻게 구현하냐에 차이가 있는데
우측방식으로 구현했다.
좌측방식은 쓰는사람을 봤는데... 이해가안된다
코드
import sys
import math
input = sys.stdin.readline
"""
1.
"""
N = int(input())
A = list(map(int, input().split()))
M = int(input())
minVal = min(A)
node = math.ceil(math.log2(N))
tree = [[float('inf'), 0] for i in range(2**(node + 1))]
node = 2**node
for i in range(0, N):
tree[node + i] = [A[i], i + 1]
def initTree(start, end, index):
if start == end:
return tree[index]
mid = (start + end) // 2
tree[index] = min(initTree(start, mid, index * 2),
initTree(mid + 1, end, index * 2 + 1))
return tree[index]
def updateTree(targetIndex, newValue, start, end, index):
if targetIndex < start or targetIndex > end:
return
if start == end:
tree[index] = [newValue, targetIndex]
return
mid = (start + end) // 2
updateTree(targetIndex, newValue, start, mid, index * 2)
updateTree(targetIndex, newValue, mid + 1, end, index * 2 + 1)
tree[index] = min(tree[index * 2], tree[index * 2 + 1])
initTree(1, node, 1)
for m in range(M):
val = list(map(int, input().split()))
if val[0] == 1:
updateTree(val[1], val[2], 1, node, 1)
else:
print(tree[1][1])
'백준 > 문제풀이_python' 카테고리의 다른 글
2024 구간 합 구하기 python (0) | 2024.02.02 |
---|---|
13537 수열과 쿼리 1 python (0) | 2024.02.01 |
16637 괄호 추가하기 (0) | 2024.01.24 |
16566 카드 게임 (python) (0) | 2023.11.22 |
15686 치킨 배달 (python) (0) | 2023.11.19 |
댓글