๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ”ฅ PS(Problem Solving) ๐Ÿ”ฅ/goorm

[๊ตฌ๋ฆ„LEVEL] ํ›„ํšŒ

by dar0m! 2020. 4. 1.
๋‚œ์ด๋„ ์ •๋‹ต๋ฅ 
โ˜…โ˜…โ˜…โ˜… -%

 

ํ”„๋ฆฌ๋ฏธ์—„ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์œ„ํด๋ฆฌ ๋น„ํƒ€์•Œ๊ณ  ์‹œ์ฆŒ3 3์›” 5์ฃผ์ฐจ

 

goorm

๊ตฌ๋ฆ„์€ ํด๋ผ์šฐ๋“œ ๊ธฐ์ˆ ์„ ์ด์šฉํ•˜์—ฌ ๋ˆ„๊ตฌ๋‚˜ ์ฝ”๋”ฉ์„ ๋ฐฐ์šฐ๊ณ , ์‹ค๋ ฅ์„ ํ‰๊ฐ€ํ•˜๊ณ , ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋Š” ํด๋ผ์šฐ๋“œ ์†Œํ”„ํŠธ์›จ์–ด ์ƒํƒœ๊ณ„์ž…๋‹ˆ๋‹ค.

www.goorm.io

๋ฌธ์ œ

์‹œํ–‰์ฐฉ์˜ค

๋”๋ณด๊ธฐ
 

7. Indexed Tree(BIT) & Range Sum

์ถœ์ฒ˜: ๋ฌธ์ œ ํ•ด๊ฒฐ์„ ์œ„ํ•œ ์ฐฝ์˜์  ์•Œ๊ณ ๋ฆฌ์ฆ˜(๊ณ ๊ธ‰) https://www.acmicpc.net/blog/view/21 1) Range Sum์ผ๋ฐ˜...

blog.naver.com

์ด ๋ธ”๋กœ๊ทธ๊ฐ€ ๋„์›€์ด ๋งŽ์ด ๋๋‹ค. ์ฒ˜์Œ์— ๋ˆ„์ ํ•ฉ์œผ๋กœ ํ–ˆ๋‹ค๊ฐ€ ๊ฐฑ์‹ ํ•˜๋Š”๋ฐ ์–ด์ฐจํ”ผ n*n ์‹œ๊ฐ„์ดˆ๊ณผ๋ผ์„œ... ๊ฒฐ๊ตญ ๊ฒ€์ƒ‰์„ ํ–ˆ๋‹ค. 'c++ ๋ˆ„์ ํ•ฉ ๊ฐฑ์‹ ' ์ด๋Ÿฐ์‹์œผ๋กœ ๊ฒ€์ƒ‰ํ–ˆ๋‹ค๊ฐ€ ์ฐพ์€ ๋ธ”๋กœ๊ทธ์ธ๋ฐ ์ •๋ฆฌ๊ฐ€ ์ž˜ ๋˜์–ด ์žˆ์–ด์„œ ์ข‹์•˜๋‹ค. 

์•„๋ž˜ ์ฝ”๋“œ๋Š” indexed tree ๋ฅผ ์ด์šฉํ•ด์„œ ํ’€์—ˆ๊ณ  '์•„์ง 93์ . 15๋ฒˆ ํ…Œ์ŠคํŠธ์ผ€์ด์Šค ํ‹€๋ฆผ.' ์ƒํƒœ์ด๋‹ค.

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
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long int ll;
int n, m, base;
ll idt[1 << 27];
void update(int pos, int num) {
    idt[pos] -= num;
    pos >>= 1// pos /= 2;
    while (pos) {
        idt[pos] = idt[pos * 2+ idt[pos * 2 + 1];
        pos /= 2;
    }
}
ll sum(int st, int end) {
    ll ret = 0;
    while (st < end) {
        if (st % 2 == 1) ret += idt[st], st++;
        if (!(end % 2)) ret += idt[end], end--;
        st >>= 1end >>= 1;
    }
    if (st == end) ret += idt[st];
    return ret;
}
int main() {
    scanf("%d %d"&n, &m);
    for (base = 1; base < n; base *= 2);
    for (int i = base; i < base + n; i++) {
        scanf("%d"&idt[i]);
    }
    for (int i = base - 1; i > 0; i--) {
        idt[i] = idt[i * 2+ idt[i * 2 + 1];
    }
    while (m--) {
        int a, b, c;
        scanf("%d %d %d"&a, &b, &c);
        if (a == 1) {
            printf("%lld\n", sum(base + b - 1, base + c - 1));
        }
        else {
            update(base + b - 1, c);
        }
    }
 
    return 0;
}
cs

ํ•ด๊ฒฐ

key point, indexed tree 

 

 

์ฝ”๋“œ

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
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long int ll;
int n, m, base;
ll idt[1 << 25];
void update(int pos, int num) {
    idt[pos] -= num;
    pos >>= 1// pos /= 2;
    while (pos) {
        idt[pos] = idt[pos * 2+ idt[pos * 2 + 1];
        pos /= 2;
    }
}
ll sum(int st, int end) {
    ll ret = 0;
    while (st < end) {
        if (st % 2 == 1) ret += idt[st], st++;
        if (!(end % 2)) ret += idt[end], end--;
        st >>= 1end >>= 1;
    }
    if (st == end) ret += idt[st];
    return ret;
}
int main() {
    scanf("%d %d"&n, &m);
    for (base = 1; base < n; base *= 2);
    for (int i = base; i < base + n; i++) {
        scanf("%d"&idt[i]);
    }
    for (int i = base - 1; i > 0; i--) {
        idt[i] = idt[i * 2+ idt[i * 2 + 1];
    }
    while (m--) {
        int a, b, c;
        scanf("%d %d %d"&a, &b, &c);
        if (a == 1) {
            printf("%lld\n", sum(base + b - 1, base + c - 1));
        }
        else {
            update(base + b - 1, c);
        }
    }
 
    return 0;
}
cs

 

ํ›„๊ธฐ

์™€ ๊ทธ๋ƒฅ ๋„ˆ๋ฌด ๋ชจ๋ฅด๊ฒ ์–ด์„œ ์ฝ”๋“œ ์˜ฌ๋ ค๋†“๊ณ  ์งˆ๋ฌธ์„ ํ–ˆ๋”๋‹ˆ ์„ ์ƒ๋‹˜???์ด ํ…Œ์ŠคํŠธ์ผ€์ด์Šค ์˜ค๋ฅ˜๋ผ๊ณ  ๋‹ต๋ณ€ํ•ด์ฃผ์…”์„œ ๊ทธ๋Œ€๋กœ ๋‹ค์‹œ ์ œ์ถœํ•˜๋‹ˆ๊นŒ ์ •๋‹ต๋–ด๋‹ค!! ์ด๋Ÿฐ์  ์ฒ˜์Œ์ด๋ผ ๋‚ฏ์„ค๊ณ  ๊ธฐ๋ถ„์ข‹๋‹ค ^^. ์š”์ฆ˜ ํ•™๊ต ์‚ฌ์ด๋ฒ„๊ฐ•์˜ ๋“ฃ๊ณ  ๊ณผ์ œํ•˜๋Š๋ผ ๋„ˆ๋ฌด ์˜ค๋žœ๋งŒ์— ๋“ค์–ด๊ฐ”๋Š”๋ฐ ์ข‹์€ ์†Œ์‹์žˆ์–ด์„œ ๋„ˆ๋ฌด ์ข‹๋‹ค~~

๋Œ“๊ธ€