[10868] 최솟값 (세그먼트 트리)

2023. 6. 5. 17:08·Coding Test/Tree
728x90
 

10868번: 최솟값

N(1 ≤ N ≤ 100,000)개의 정수들이 있을 때, a번째 정수부터 b번째 정수까지 중에서 제일 작은 정수를 찾는 것은 어려운 일이 아니다. 하지만 이와 같은 a, b의 쌍이 M(1 ≤ M ≤ 100,000)개 주어졌을 때는

www.acmicpc.net

 

분석

 

세그먼트 트리, 인덱스 트리, 구간합

1. 세그먼트 트리 주어진 데이터의 구간합과 데이터 업데이트를 빠르게 수행하기 위해 고안해낸 자료구조 2. 구간합 합배열(prefix sum)은 업데이트가 느림 arr[1]를 update 한다면 ? sum[1]부터 sum[9]까지

karla.tistory.com

 

 

풀이

"""
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이하의 값을 갖는다.
첫째 줄에 N, M이 주어진다. 다음 N개의 줄에는 N개의 정수가 주어진다. 다음 M개의 줄에는 a, b의 쌍이 주어진다.
"""
import sys
input = sys.stdin.readline

n,m= map(int, input().split())
treeHeight=0 # 트리 높이
lenth=n # 리프노드 갯수

# 높이 계산 : 리프노드의 개수를 2씩 나누면서
while lenth != 0:
    lenth//=2
    treeHeight+=1

# 트리 길이 2ᵏ*2
treeSize=pow(2, treeHeight + 1)

# 리프노드 전 인덱스 2ᵏ-1 = 2ᵏ*2/2 -1
leftStartIdx=treeSize//2-1

# 인덱스 트리 저장 리스트
tree=[sys.maxsize]*(treeSize+1)

# 데이터를 리프노드에 저장
for i in range(leftStartIdx+1, leftStartIdx+n+1):
    tree[i]=int(input())

# 인덱스 트리 생성 함수
def setTree(idx):
    # 인덱스가 루트노드가 아닐때까지
    while idx!=1:
        if tree[idx//2]>tree[idx]:
            tree[idx//2]=tree[idx]
        idx -= 1


# 원본데이터 제외하고 1까지
setTree(treeSize-1)  # 2ᵏ-1부터 2까지
# print(tree)

# 최솟값 출력 함수
def getMul(sIdx, eIdx):
    minVal=sys.maxsize
    while sIdx <= eIdx:
        if sIdx%2==1:  # 선택 : 부모노드 대상범위 제거, 독립노드
            minVal=min(minVal,tree[sIdx])
            sIdx+=1
        sIdx=sIdx//2
        if eIdx%2==0:  # 선택 : 부모노드 대상범위 제거, 독립노드
            minVal=min(minVal,tree[eIdx])
            eIdx-=1
        eIdx=eIdx//2
    return minVal

for _ in range(m):
    s,e=map(int,input().split())
    print(getMul(leftStartIdx+s, leftStartIdx+e))

 

 

 

 

 

728x90
저작자표시 비영리 변경금지 (새창열림)
'Coding Test/Tree' 카테고리의 다른 글
  • [11505] 구간 곱 구하기 (세그먼트 트리)
  • [14425] 문자열 집합 (트라이, Trie)
  • [11437] 최소 공통 조상 (트리, 일반 LCA)
  • [1068] 트리 (리프 노드의 개수 구하기, DFS)
Karla Ko
Karla Ko
𝘾𝙤𝙣𝙩𝙞𝙣𝙪𝙤𝙪𝙨𝙡𝙮 𝙄𝙢𝙥𝙧𝙤𝙫𝙞𝙣𝙜, 𝘾𝙤𝙣𝙨𝙩𝙖𝙣𝙩𝙡𝙮 𝘿𝙚𝙫𝙚𝙡𝙤𝙥𝙞𝙣𝙜 𝙔𝙚𝙨!
    250x250
  • Karla Ko
    karlaLog
    Karla Ko
  • 전체
    오늘
    어제
    • Total (467)
      • Spring (19)
      • JPA (4)
      • Cloud & Architecture (15)
        • Kubernetes (5)
        • Docker (3)
        • MSA (2)
        • GCP (1)
        • AWS (4)
      • Devops (1)
      • Message Queue (4)
        • Kafka (2)
        • RabbitMQ (2)
      • Git (4)
      • DB (4)
      • Java (9)
      • Python (4)
      • CS (11)
        • OS (8)
        • Network (2)
        • Algorithm (1)
      • Coding Test (392)
        • programmers (156)
        • Graph (43)
        • DP (37)
        • Search (31)
        • Tree (13)
        • Data Structure (26)
        • Combination (12)
        • Implement (18)
        • Geedy (23)
        • Sort (7)
        • Math (21)
        • geometry (2)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Algorithm
    프로그래머스
    BFS
    알고리즘
    구간합
    다익스트라
    그리디
    이분탐색
    LIS
    최소신장트리
    큐
    자료구조
    스택
    DP
    재귀
    최단거리
    백준
    월간코드챌린지
    힙
    DFS
    플로이드워셜
    조합
    트리
    덱
    그래프
    동적계획법
    파이썬
    정렬
    최대공약수
    구현
  • hELLO· Designed By정상우.v4.10.3
Karla Ko
[10868] 최솟값 (세그먼트 트리)
상단으로

티스토리툴바