티스토리 뷰

# 문제

17408번 : 수열과 쿼리 17408

https://www.acmicpc.net/problem/17408

 

 

세그먼트 트리로 가장 큰 수와 두번재로 큰 수의 합을 구하는 문제이다.

 

세그먼트 트리로 범위안에서 가장 큰 수를 구하는 문제에서 두번재로 큰 수까지 구하는 로직을 넣으면 된다.

 

세그먼트 트리를 2차원 배열로 만들어서 가장 큰 값과 두번재 값을 구한 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
	public static void main(String[] args) throws IOException {
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		
		int N = Integer.parseInt(st.nextToken());
		int start = 1;
		
		while (start < N) start *= 2;
		long[][] tree = new long[start * 2][2];
		
		st = new StringTokenizer(br.readLine());
		for (int i = 0; i < N; i++) tree[start + i][0] = Integer.parseInt(st.nextToken());
		
		for (int i = start - 1; i > 0; i--) {
			long[] result = find(tree[i * 2], tree[i * 2 + 1]);
			tree[i][0] = result[0];
			tree[i][1] = result[1];
		}
		
		st = new StringTokenizer(br.readLine());
		int M = Integer.parseInt(st.nextToken());
		
		for (int k = 0; k < M; k++) {
			st = new StringTokenizer(br.readLine());
			int i = Integer.parseInt(st.nextToken());
			int a = Integer.parseInt(st.nextToken());
			int b = Integer.parseInt(st.nextToken());
			
			if (i == 1) {
				int point = a + start - 1;
				tree[point][0] = b;
				while (point > 0) {
					point /= 2;
					long[] result = find(tree[point * 2], tree[point * 2 + 1]);
					tree[point][0] = result[0];
					tree[point][1] = result[1];
				}
				
			}
			
			if (i == 2) {
				int start_index = Math.min(a, b) + start - 1;
				int end_index = Math.max(a, b) + start - 1;
				long[] answer = {0, 0};
				while (start_index <= end_index) {
					if (start_index % 2 == 1) {
						long[] result = find(answer, tree[start_index++]);
						answer[0] = result[0];
						answer[1] = result[1];
					}
					if (end_index % 2 == 0) {
						long[] result = find(answer, tree[end_index--]);
						answer[0] = result[0];
						answer[1] = result[1];
					}
					start_index /= 2;
					end_index /= 2;
				}
				System.out.println(answer[0] + answer[1]);
			}
		}
	}
	
	static long[] find(long[] arr1, long[] arr2) {
		long max = Long.MIN_VALUE;
		long second = Long.MIN_VALUE;
		
		for (long i : arr1) {
			if (i >= max) {
				second = max;
				max = i;
			} 
			else if (i > second) {
				second = i;
			}
		}
		
		for (long i : arr2) {
			if (i >= max) {
				second = max;
				max = i;
			} else if (i > second) {
				second = i;
			}
		}
		return new long[] {max, second};
	}
}

 

'알고리즘' 카테고리의 다른 글

백준 27968번 - 사사의 사차원 사탕 봉지  (1) 2025.03.06
백준 5619번 - 세 번째  (0) 2025.02.27
세그먼트 트리 문제 풀이  (0) 2025.02.14
세그먼트 트리 합구하기  (0) 2025.02.14
세그먼트 트리  (0) 2025.02.13
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2026/01   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함