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

[BOJ] #11505 ๊ตฌ๊ฐ„ ๊ณฑ ๊ตฌํ•˜๊ธฐ

by dar0m! 2021. 2. 15.
์‹œ๊ฐ„ ์ œํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ ์ •๋‹ต ๋น„์œจ
 1 ์ดˆ 256 MB 33.686 %
 

11505๋ฒˆ: ๊ตฌ๊ฐ„ ๊ณฑ ๊ตฌํ•˜๊ธฐ

์ฒซ์งธ ์ค„์— ์ˆ˜์˜ ๊ฐœ์ˆ˜ N(1 ≤ N ≤ 1,000,000)๊ณผ M(1 ≤ M ≤ 10,000), K(1 ≤ K ≤ 10,000) ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. M์€ ์ˆ˜์˜ ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚˜๋Š” ํšŸ์ˆ˜์ด๊ณ , K๋Š” ๊ตฌ๊ฐ„์˜ ๊ณฑ์„ ๊ตฌํ•˜๋Š” ํšŸ์ˆ˜์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N+1๋ฒˆ์งธ ์ค„

www.acmicpc.net

 

๋ฌธ์ œ

 

ํ•ด๊ฒฐ

key point, ์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ, '์ตœ์†Ÿ๊ฐ’'๊ณผ ๋ฐฉ์‹ ๋™์ผ

2021/02/15 - [๐Ÿ”ฅ PS(Problem Solving) ๐Ÿ”ฅ/BOJ] - [BOJ] #10868 ์ตœ์†Ÿ๊ฐ’

  • ์œ„์— ๋ณด์ด๋Š” ์ตœ์†Ÿ๊ฐ’ ๋ฌธ์ œ์™€ ๋ฐฉ๋ฒ•์€ ๋™์ผํ•˜๋‚˜ ๊ตฌ๊ฐ„์˜ ๊ณฑ์„ ๊ตฌํ•ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.
  • ๋”ฐ๋ผ์„œ, ์ดˆ๊ธฐํ™”๋ฅผ ๋”ฐ๋กœ ํ•ด์ค„ ํ•„์š”๊ฐ€ ์—†๊ณ ,
  • update ํ•จ์ˆ˜์—์„œ seg[i]๊ฐ’์„ ์ €์žฅํ•  ๋•Œ, ๊ตฌ๊ฐ„์˜ ๊ณฑ์„ ์ €์žฅํ•ด์•ผ ํ•˜๋ฉฐ
  • queryํ•จ์ˆ˜์—์„œ ๊ตฌ๊ฐ„์˜ ๊ณฑ์„ ๋ฆฌํ„ดํ•ด์•ผ ํ•œ๋‹ค.

 

์ฝ”๋“œ

๋ฉ”๋ชจ๋ฆฌ ์‹œ๊ฐ„
 17616 KB 324 ms
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
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
#define mod 1000000007
vector<long long int>seg;
int n, m, k;
int h = 1;
void update(int i, int val) {
    i += h - 1;
    seg[i] = val;
    while (i > 1) {
        i /= 2;
        seg[i] = (seg[i * 2* seg[i * 2 + 1]) % mod;
    }
}
long long int query(int l, int r, int num, int nl, int nr) {
    //l,r์ด ์ฐพ์œผ๋ ค๋Š” ๋ฒ”์œ„, num์ด ํ˜„์žฌ ๋ณด๊ณ  ์žˆ๋Š” ๋…ธ๋“œ
    //nl,nr ํ˜„์žฌ ๋ณด๊ณ ์žˆ๋Š” ๋ฒ”์œ„
    if (l <= nl && nr <= r) return seg[num];
    else if (nl > r || nr < l) return 1;
    int mid = (nl + nr) / 2;
    return (query(l, r, num * 2, nl, mid) * query(l, r, num * 2 + 1, mid + 1, nr)) % mod;
}
int main() {
    scanf("%d %d %d"&n, &m, &k);
    while (h < n) h <<= 1//๋†’์ด๊ตฌํ•˜๊ธฐ 1 2 4 8
    seg.resize(h * 2);
    for (int i = 0; i < n; i++) {
        int num;
        scanf("%d"&num);
        update(i + 1, num);
    }
    for (int i = 0, a, b, c; i < m + k; i++) {
        scanf("%d %d %d"&a, &b, &c);
        if (a == 1) update(b, c);
        else printf("%lld\n", query(b, c, 11, h));
    }
    return 0;
}
cs

๋Œ“๊ธ€