카테고리 없음
[백준] [C++] 11505번 구간 곱 구하기 (segment tree)
느스그
2021. 7. 10. 22:07
1. 문제
11505번: 구간 곱 구하기 (acmicpc.net)
11505번: 구간 곱 구하기
첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)과 M(1 ≤ M ≤ 10,000), K(1 ≤ K ≤ 10,000) 가 주어진다. M은 수의 변경이 일어나는 횟수이고, K는 구간의 곱을 구하는 횟수이다. 그리고 둘째 줄부터 N+1번째 줄
www.acmicpc.net
2. 풀이
커피숍 문제와 똑같이 문제를 해결하였다.
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 60 61 62 63 64 65 66 67 68 69 70 71 72 | #include <bits/stdc++.h> using namespace std; int N, M, K; vector<long long> number; vector<long long> seg; const long long MOD = 1000000007; long long init(int lo, int hi, int idx) { if(lo + 1 == hi) { return seg[idx] = number[lo]; } int mid = (lo + hi) / 2; return seg[idx] = (init(lo, mid, idx*2) * init(mid, hi, idx*2 + 1)) % MOD; } long long update(int lo, int hi, int idx, int ni) { if(lo + 1 == hi) { return seg[idx] = number[ni]; } int mid = (lo + hi)/2; if(ni < mid) { return seg[idx] = (update(lo, mid, idx*2, ni) * seg[idx*2 + 1])%MOD; } else { return seg[idx] = (update(mid, hi, idx*2 + 1, ni) * seg[idx*2])%MOD; } } long long product(int lo, int hi, int idx, int start, int end) { if(lo == start && hi == end) { return seg[idx]; } int mid = (lo + hi) / 2; if(end <= mid) { return product(lo, mid, idx*2, start, end); } else if(mid <= start) { return product(mid, hi, idx*2 + 1, start, end); } else { return (product(lo, mid, idx*2, start, mid) * product(mid, hi, idx*2 + 1, mid, end))%MOD; } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin>>N>>M>>K; number = vector<long long>(N); seg = vector<long long>(N*5); for(int i = 0; i < N; i++) { cin>>number[i]; } init(0, N, 1); for(int i = 0; i < M + K; i++) { int a, b, c; cin>>a>>b>>c; if(a == 1) { number[b - 1] = c; update(0, N, 1, b - 1); } else { if(b > c) { swap(b, c); } cout<<(product(0, N, 1, b - 1, c)%MOD)<<"\n"; } } } | cs |