본문 바로가기

알고리즘 (2020 : 08 : 10 ~ )/세그먼트 트리

(5)
[백준 / BOJ] 2812 크게 만들기 (Java / 세그먼트 트리) 문제 출처 : https://www.acmicpc.net/problem/2812 2812번: 크게 만들기 N자리 숫자가 주어졌을 때, 여기서 숫자 K개를 지워서 얻을 수 있는 가장 큰 수를 구하는 프로그램을 작성하시오. www.acmicpc.net N자리의 수가 주어지며 이 수에서 K개의 숫자를 제거했을때 얻는 가장 큰 수를 구하는 문제이다. 풀이 세그먼트 트리로 푼 문제다. 문제를 N자리의 수에서 (N-K)개의 숫자를 선택하는 문제로 바꾼다면, 현재 선택가능한 범위 (left ~ right)에서 (N-K)번 숫자를 뽑아 최댓값을 만드는 문제로 바뀌게 된다. 이때, left ~ right의 범위는 최대 250,000만큼 차이가 날 수 있으므로, 완전탐색으로 현재 범위에서 최댓값을 찾는다면, (250,00..
[백준 / BOJ] 1275 커피숍2 문제 출처 : https://www.acmicpc.net/problem/1275 1275번: 커피숍2 첫째 줄에 수의 개수 N과 턴의 개수 Q가 주어진다.(1 ≤ N, Q ≤ 100,000) 둘째 줄에는 처음 배열에 들어가 있는 정수 N개가 주어진다. 세 번째 줄에서 Q+2번째 줄까지는 x y a b의 형식으로 x~y까지의 합 www.acmicpc.net 커피숍 마담 동호는 손님들과 게임을한다. 게임 방식은 다음과 같다. N개의 수가 있으면 동호는 손님에게 3~7번째 수를 묻는다. 이때, 손님이 답은 000 입니다 라고 대답을한다. 그후, 8번째 수를 2로 고친다. 풀이 기본적인 세그먼트 트리로 풀리는 문제였다. 구현은 다음과 같다. 1. 입력받은 정수N개를 세그먼트 트리구조로 저장해놓는다. 2. 쿼리를..
[백준 / BOJ] 10868 최솟값 문제 출처 : www.acmicpc.net/problem/10868 10868번: 최솟값 N(1 ≤ N ≤ 100,000)개의 정수들이 있을 때, a번째 정수부터 b번째 정수까지 중에서 제일 작은 정수를 찾는 것은 어려운 일이 아니다. 하지만 이와 같은 a, b의 쌍이 M(1 ≤ M ≤ 100,000)개 주어졌을 때는 www.acmicpc.net N개의 숫자들을 입력받고 구간 (a,b)를 M번 입력받는다. 구간 a,b사이에서 가장 작은 값을 출력하는 문제다. 풀이 N과 M이 최대 10만이라 모든경우를 다 봐주면 1억번돌아서 시간초과가 나기때문에, 세그먼트 트리를 이용해서 각 구간을 빠르게 찾아줘야한다. 세그먼트 트리에 각 구간의 최솟값을 저장한다. 예제 1의 경우, 구간 1~10 에서의 최솟값은 5, 구..
[백준 / BOJ] 1395 스위치 문제 출처 : www.acmicpc.net/problem/1395 1395번: 스위치 첫 줄에는 스위치의 개수 N(2 ≤ N ≤ 100,000)과 처리할 일의 개수 M(1 ≤ M ≤ 100,000)이 주어진다. 다음 M개의 줄에 대해 각 줄에 처리할 일에 대한 정보가 담겨진 세 개의 정수 O, Si, Ti가 입력된다. O www.acmicpc.net N개의 스위치가 있고 M번의 명령이 주어진다. 명령은 O,S,T의 형태로 주어지는데, O가 1 이라면, S부터 T까지 켜져있는 전구의 갯수를 구하는 명령이고, O가 0이면, S부터 T까지의 전구의 상태를 반전시키는 명령이다. 풀이 구간 합 구하기 2와 비슷하게 풀리는 문제였다. N이 10만, M이 10만이므로, 한번 업데이트시 최악의경우 10만log10만번 ..
[백준 / BOJ] 10999 구간 합 구하기 2 문제 출처 : www.acmicpc.net/problem/10999 10999번: 구간 합 구하기 2 첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)과 M(1 ≤ M ≤ 10,000), K(1 ≤ K ≤ 10,000) 가 주어진다. M은 수의 변경이 일어나는 횟수이고, K는 구간의 합을 구하는 횟수이다. 그리고 둘째 줄부터 N+1번째 줄 www.acmicpc.net 수의 개수 N, M, K가 주어진다. M은 수의 변경이 일어나는 횟수이고, K는 각 구간의 합을 구하는 횟수이다. 앞의 수에 따라서, 변경, 합을 구하면되는데, 1은 변경이고 2는 구간합이다. 예를들어, 1 1 5 10 이 나오면, 1부터 5범위까지 +10을 해주면된다. 풀이 N의 최댓값이 1,000,000이고, M과 K가 각각 1..