본문 바로가기
PS 문제 풀이/Baekjoon

[BOJ] 백준 2268 수들의 합

by 까망 하르방 2021. 2. 16.
반응형

출처https://www.acmicpc.net/problem/2268

#세그먼트 트리 #구간 합

 Input 

3 5

0 1 3

1 1 2

1 2 3

0 2 3

0 1 3

  

 Output 

0

3

5 

세그먼트 트리 구조를 구현하는 문제입니다.

* 자료 범위가 long long 타입이 요구됩니다.

* 주어지는 query 하는 구간이 i > j 일 수 있으므로 swap 처리가 필요합니다.

- 특정 위치의 값을 수정하는 update()

void update(LL tree[], int now, int s, int e, int pos, int val) {
       if (s == e) {
              tree[now] = val;
              return;
       }
       int L = now * 2, R = L + 1, mid = (s + e) / 2;
       if(pos <= mid) update(tree, L, s, mid, pos, val);
       else update(tree, R, mid + 1, e, pos, val);
       tree[now] = tree[L] + tree[R];
}

- 특정 구간의 합을 구하는 query()

LL query(LL tree[], int now, int s, int e, int qs, int qe) {
       if (e < qs || qe < s) return 0;
       if (qs <= s && e <= qe) return tree[now];
       int L = now * 2, R = L + 1, mid = (s + e) / 2;
       return query(tree, L, s, mid, qs, qe) + query(tree, R, mid + 1, e, qs, qe);
}

- 단말 노드 크기는 1 ≤ N ≤ 1,000,000 이므로 Tree Size는 {단말노드 개수 × 4} 정도로 잡습니다.

  (update, query 호출횟수는 최대 1,000,000 (=M) 입니다.)

- query() 결과만 출력합니다.

  (문제 조건 "1" update, "0" query)


#include <stdio.h>
 
typedef long long LL;
const int MAX_N = 1e6 + 5;
int N, M, cmd;
int pos, val, qs, qe;
LL tree[4 * MAX_N];
inline void swap(int& A, int& B) { int temp = A; A = B; B = temp; }
void update(LL tree[], int now, int s, int e, int pos, int val) {
    if (s == e) {
        tree[now] = val;
        return;
    }
    int L = now * 2, R = L + 1, mid = (s + e) / 2;
    if (pos <= mid) update(tree, L, s, mid, pos, val);
    else update(tree, R, mid + 1, e, pos, val);
    tree[now] = tree[L] + tree[R];
}
 
LL query(LL tree[], int now, int s, int e, int qs, int qe) {
    if (e < qs || qe < s) return 0;
    if (qs <= s && e <= qe) return tree[now];
    int L = now * 2, R = L + 1, mid = (s + e) / 2;
    return query(tree, L, s, mid, qs, qe) + query(tree, R, mid + 1, e, qs, qe);
}
 
int main() {
    // freopen("input.txt", "r", stdin);
    scanf("%d %d", &N, &M);
 
    while (M--) {
        scanf("%d", &cmd);
        if (cmd) {
            scanf("%d %d", &pos, &val);
            update(tree, 1, 1, N, pos, val);
        }
        else {
            scanf("%d %d", &qs, &qe);
            if (qs > qe) swap(qs, qe);
            printf("%lld\n", query(tree, 1, 1, N, qs, qe));
        }
    }
}

 

반응형

'PS 문제 풀이 > Baekjoon' 카테고리의 다른 글

[BOJ] 백준 16235 나무 재테크 (C++)  (0) 2021.02.16
[BOJ] 백준 1280 나무 심기  (0) 2021.02.16
[BOJ] 백준 2536 버스 갈아타기  (0) 2021.02.16
[BOJ] 백준 2848 알고스팟어  (0) 2021.02.16
[BOJ] 백준 2636 치즈  (0) 2021.02.16

댓글