14427 수열과 쿼리 15

    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

    댓글