https://www.acmicpc.net/problem/2357
2357번: 최솟값과 최댓값
N(1 ≤ N ≤ 100,000)개의 정수들이 있을 때, a번째 정수부터 b번째 정수까지 중에서 제일 작은 정수, 또는 제일 큰 정수를 찾는 것은 어려운 일이 아니다. 하지만 이와 같은 a, b의 쌍이 M(1 ≤ M ≤ 100
www.acmicpc.net
🐹 Description
문제
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의 쌍이 주어진다.
출력
M개의 줄에 입력받은 순서대로 각 a, b에 대한 답을 최솟값, 최댓값 순서로 출력한다.
예제 입력 1 복사
10 4
75
30
100
38
50
51
52
20
81
5
1 10
3 5
6 9
8 10
예제 출력 1 복사
5 100
38 100
20 81
5 81
🧠 Solve
⚀ 풀이
기본 자료구조 문제입니다. 일반 순회 O(N)에서 O(logN)인 세그먼트 트리를 이용해서 풀어야 제한시간내에 통과가 가능하며, 세그먼트 트리를 이용해 문제를 풉니다.
자세한 자료구조에 대한 설명은 자료구조, 세그먼트 트리에서 확인하시기 바랍니다.
from sys import stdin
input = stdin.readline
def init(node, start, end):
if start == end:
tree[node] = (arr[start], arr[start])
return tree[node]
mid = (start + end) // 2
left_min, left_max = init(node*2, start, mid)
right_min, right_max = init(node*2+1, mid+1, end)
tree[node] = (min(left_min, right_min), max(left_max, right_max))
return tree[node]
def query(node, start, end, left, right):
if left > end or right < start:
return float('inf'), 0
if left <= start and end <= right:
return tree[node]
mid = (start + end) // 2
left_min, left_max = query(node*2, start, mid, left, right)
right_min, right_max = query(node*2+1, mid+1, end, left, right)
return min(left_min, right_min), max(left_max, right_max)
N, M = map(int, input().split())
arr = [int(input()) for _ in range(N)]
tree = [(0, 0)] * (4*N)
init(1, 0, N-1)
result = []
for _ in range(M):
a, b = map(int, input().split())
result.append(query(1, 0, N-1, a-1, b-1))
for c in result:
print(f'{c[0]} {c[1]}')
'AlgoStruct > BJ' 카테고리의 다른 글
백준 1520, 내리막 길(골드3) [Python] (0) | 2023.09.19 |
---|---|
백준 7579, 앱(골드3) [Python] (0) | 2023.08.14 |
백준 17404, 다리놓기(골드4) [Python] (0) | 2023.08.06 |
백준 1010, 다리놓기(실버5) [Python] (0) | 2023.07.23 |
백준 11501, 주식(실버2) [Python] (0) | 2023.07.20 |