Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- dp
- 2839
- 2020 KAKAO BLIND
- 2638
- Spring
- 스프링
- 1로 만들기
- BFS
- 쓰레드 풀
- 포두부 보쌈
- 2589
- 문자열 압축
- 스프링 MVC
- 프로그래머스
- 백준
- 투어
- 다이나믹 프로그래밍
- 동적 프로그래밍
- 호유동
- 서블릿
- 완도산회
- Servlet
- 맛집
- 양꼬치
- 고모네 콩탕
- 알고리즘
- 맛집 투어
- 설탕 배달
- HTTP API
- mvc
Archives
- Today
- Total
프로그래밍 공방
[백준] 2042번 : 구간 합 구하기 본문
문제
문제해결방법
이 문제는 세그먼트 트리를 사용해서 풀었다.
코드
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | package baekjoon; import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.StringTokenizer; public class Main2042_구간합구하기 { public static int N; public static long[] arr, segment; public static long makeTree(int index, int s, int e) { if(s==e) return segment[index] = arr[s]; int mid = (s+e)/2; return segment[index] = makeTree(index*2, s, mid) + makeTree(index*2+1, mid+1, e); } public static void update(int index, int vIndex, int s, int e, long diff) { if(vIndex<s || vIndex>e) return; segment[index] += diff; if(s==e) return; int mid = (s+e)/2; update(index*2, vIndex, s, mid, diff); update(index*2+1, vIndex, mid+1, e, diff); } public static long sum(int index, int s, int e, int vs, int ve) { if(ve<s || vs>e) return 0; if(vs<=s && e<=ve) return segment[index]; int mid=(s+e)/2; return sum(index*2, s, mid, vs, ve) + sum(index*2+1, mid+1, e, vs, ve); } public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); N = Integer.parseInt(st.nextToken()); int op = Integer.parseInt(st.nextToken()) + Integer.parseInt(st.nextToken()); arr = new long[N+1]; segment = new long[4*N]; for(int i=1; i<=N; i++) arr[i] = Integer.parseInt(br.readLine()); makeTree(1, 1, N); for(int i=0; i<op; i++) { st = new StringTokenizer(br.readLine()); int a = Integer.parseInt(st.nextToken()); int b = Integer.parseInt(st.nextToken()); int c = Integer.parseInt(st.nextToken()); if(a==1) { long diff = c - arr[b]; arr[b] = c; update(1, b, 1, N, diff); } else { long s = sum(1, 1, N, b, c); System.out.println(s); } } } } | cs |
코드에 대한 피드백이나 더 좋은 아이디어는 언제나 환영입니다.
'개발 > 문제해결' 카테고리의 다른 글
[백준] 1058번 : 친구 (0) | 2020.12.17 |
---|---|
[백준] 9205번 : 맥주 마시면서 걸어가기 (0) | 2020.12.16 |
[프로그래머스] N으로 표현 (0) | 2020.12.07 |
[백준] 3176번 : 도로 네트워크 (0) | 2020.12.06 |
[백준] 1915번 : 가장 큰 정사각형 (0) | 2020.11.27 |