프로그래밍 공방

[백준] 2042번 : 구간 합 구하기 본문

개발/문제해결

[백준] 2042번 : 구간 합 구하기

hyosupsong 2020. 12. 7. 23:20

문제

www.acmicpc.net/problem/2042

 

2042번: 구간 합 구하기

첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)과 M(1 ≤ M ≤ 10,000), K(1 ≤ K ≤ 10,000) 가 주어진다. M은 수의 변경이 일어나는 횟수이고, K는 구간의 합을 구하는 횟수이다. 그리고 둘째 줄부터 N+1번째 줄

www.acmicpc.net

문제해결방법

이 문제는 세그먼트 트리를 사용해서 풀었다.

코드

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<|| 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<|| vs>e) return 0;
        if(vs<=&& 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(11, 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(11, N, b, c);
                System.out.println(s);
            }
        }
    }
}
cs


코드에 대한 피드백이나 더 좋은 아이디어는 언제나 환영입니다.