Segment Tree 16

BOJ 2357 - 최솟값과 최댓값

문제 태그 : https://www.acmicpc.net/problem/2357 문제 소개 N개의 숫자들이 주어지고 쿼리가 주어진다. 쿼리가 a,b가 주어지면 a번째 숫자부터 b번째 숫자 사이의 최솟값과 최댓값을 구해야 한다. 문제 풀이 지금은 N개의 숫자들이 바뀌지는 않지만, 아무튼 구간의 최댓값과 구간의 최솟값은 Segment Tree를 사용함으로써 한 번 구하는 데 $O(lgN)$에 구할 수 있음이 잘 알려져 있다. 구간합을 구할 때 구하고자 하는 구간에 포함되어지지 않는 노드는 0을 반환한다. 항등원이기 때문이다. 같은 이유로 최솟값 세그트리에서는 항등원인 inf를 반환해야 하고, 최댓값연산에서는 항등원이 -inf이므로 구간이 포함되어지지 않으면 -inf를 반환해야 한다. 코드 1 2 3 4 5 ..

BOJ 2472 - 체인점

문제 태그 : https://www.acmicpc.net/problem/2472 정말 좋은 문제라고 생각한다. 여러가지 테크닉을 같이 써야 문제를 해결할 수 있다. 그런데 최근에 재채점을 당해 틀려서 다시 푼 김에 글을 작성하였다. 문제 소개 그래프가 주어지고 3개의 출발 지점이 주어진다. 만약 지점 A와 B가 존재해서 출발지점 3곳에 대해서 모두 B가 A보다 출발 지점까지의 거리가 짧으면 A에는 매장을 설치할 수 없다. 각 지점에 대해서 질의를 던지면 그 지점에 매장을 설치할 수 있는지 대답을 해야한다. 문제 풀이 일단 그래프 상에서 어떠한 한 노드를 중심으로 다른 모든 점까지의 거리를 각각 구하는 것은 다익스트라를 3번 돌리는 것으로 쉽게 처리해 줄 수가 있다. 다르게 말하면 우리는 모든 노드에 대해..

BOJ 13925 - 수열과 쿼리 13

문제 태그 : https://www.acmicpc.net/problem/13925 문제 소개 x y v: Ai = (Ai + v) % MOD를 수행한다. (x ≤ i ≤ y) x y v: Ai = (Ai × v) % MOD를 수행한다. (x ≤ i ≤ y) x y v: Ai = v를 수행한다. (x ≤ i ≤ y) x y: (ΣAi) % MOD를 출력한다. (x ≤ i ≤ y) 의 4가지 쿼리를 처리해야하는 문제이다. 문제 풀이 일단 이런식으로 처리하는데에 있어 기본적으로 lazy segment tree를 생각할 수 있다. 하지만 여기서 lazy하게 처리하는 과정에서 걸리는 부분이 있다. 기존의 lazy 방식은 최대한 미루고 나중에 처리해 주는 방식이다. 따라서 한 노드에 처리해 주어야 할 양이 쌓이기도..

BOJ 17974 - Same Color

797이 들어간 문제로 ICPC 2019 Seoul G번인 이 문제를 선택했다. 문제 태그 : https://www.acmicpc.net/problem/17974 문제 소개 점 N개의 좌표와 색깔이 주어진다. 우리는 이 점들중 1개이상, 몇 개의 점들을 뽑아야 한다. 뽑힌 점들을 A그룹이라고 하자. 뽑히지 않은 점들을 B그룹이라고 하자. 이때 모든 B 그룹의 점들은 가장 가까운 A그룹의 점들에 색깔이 같은 점이 존재해야 한다. 이때 뽑을 수 있는 A그룹의 최소 크기를 구하시오. 문제 풀이 일단 수직선상에 점을 흩뿌려놓고 생각을 해보자. 가장 먼저 연속된 같은 색깔의 점들을 그룹으로 묶어야 한다. 이때 관찰을 할 수 있다. 한 그룹내에서 최소 1개이상의 점은 뽑아야한다. 한 그룹내에서 최대 2개의 점까지만..

카테고리 없음 2020.03.13

알고리즘 & 자료구조 복기글 (6) Segment Tree

한 번 배웠다하면 응용되는 부분도 엄청많고 정말 많은 문제에서 다양하게 사용되는 자료구조인 Segment Tree를 소개하려 한다. 예제 - 구간 합 구하기 1 링크는 https://www.acmicpc.net/problem/2042 다. 평소처럼 Segment Tree란? 으로 시작하지 않고 예제를 가지고 오며 시작한 이유는 간단하다. Segment Tree의 역할, 존재의의, 이점등을 가장 잘 설명할 수 있는 문제이기 때문이다. 워낙 유명한 문제인 만큼 풀린사람 수도 엄청나다는 것을 알 수 있다. Segment Tree를 알면서 이 문제를 모르기는 쉽지 않다. 이 문제에서 요구하는 사항은 두 가지다. 1. 배열의 값을 바꾼다. 2. 구간의 합을 구한다. 시간을 생각하지 않고 가장 쉽게 풀 수 있는 방..

BOJ 17955 - Max or Min

문제 태그 : https://www.acmicpc.net/problem/17955 나한테 잘 맞는 문제였다. 정말 좋은 문제라고 생각한다. 문제 소개 n,m이 주어진다. 이후 1 이상 m 이하의 수 n개가 주어진다. n개의 숫자는 원형으로 이루어져 있다. 이후 2가지 행동을 할 수 있다. 1. 어떤 한 칸을 골라 그 수를 max(원래 숫자, 왼쪽의 숫자, 오른쪽 숫자)로 바꾼다. 2. 어떤 한 칸을 골라 그 수를 min(원래 숫자, 왼쪽의 숫자, 오른쪽 숫자)로 바꾼다. 원형으로 이루어진 n개의 숫자를 모두 (1,2,3,...m)으로 만드는데 필요한 최소 행동의 횟수를 각각 구하시오. 만약 만들 수 없다면 -1을 출력한다. 문제 풀이 스포 주의! Step1. 문제 관찰 문제의 예제를 봄으로써 몇가지 사실..