Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 구현
- BFS
- Network
- 세그먼트 트리
- 이분탐색
- mst
- 수학
- 완전탐색
- 후니의 쉽게 쓴 시스코 네트워킹
- java
- 스택
- 프로그래머스
- Effective Java
- dfs
- 에라토스테네스의 체
- 백준
- 문자열
- 알고리즘
- 동적계획법
- 투 포인터
- 백트래킹
- 시뮬레이션
- Kotlin
- swea
- JUnit 5
- CS
- 플로이드-와샬
- 그리디
- 위상정렬
- 유니온 파인드
Archives
반갑습니다!
[백준] 10999 구간 합 구하기 2 본문
풀이
Segment Tree + Lazy Propagation을 통해서 해결하였다. 각각의 개념을 잘 모른다면 Segment Tree, Lazy Propagation 글을 참고하자.
코드
C++
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <iostream> | |
#include <vector> | |
using namespace std; | |
int n, m, k; | |
vector<long long> num, tree, lazy; | |
long long init(int node, int start, int end) { | |
if (start == end) return tree[node] = num[end]; | |
int mid = (start + end) / 2; | |
return tree[node] = init(2 * node, start, mid) + init(2 * node + 1, mid + 1, end); | |
} | |
void update_lazy(int node, int start, int end) { | |
if (lazy[node] != 0) { | |
tree[node] += (end - start + 1) * lazy[node]; | |
if (start != end) { | |
lazy[2 * node] += lazy[node]; | |
lazy[2 * node + 1] += lazy[node]; | |
} | |
lazy[node] = 0; | |
} | |
} | |
void update_range(int node, int start, int end, int left, int right, long long diff) { | |
update_lazy(node, start, end); | |
if (left > end || start > right) return; | |
if (left <= start && end <= right) { | |
tree[node] += (end - start + 1) * diff; | |
if (start != end) { | |
lazy[2 * node] += diff; | |
lazy[2 * node + 1] += diff; | |
} | |
return; | |
} | |
int mid = (start + end) / 2; | |
update_range(2 * node, start, mid, left, right, diff); | |
update_range(2 * node + 1, mid + 1, end, left, right, diff); | |
tree[node] = tree[2 * node] + tree[2 * node + 1]; | |
} | |
long long sum(int node, int start, int end, int left, int right) { | |
update_lazy(node, start, end); | |
if (start > right || end < left) return 0; | |
if (left <= start && end <= right) return tree[node]; | |
int mid = (start + end) / 2; | |
return sum(2 * node, start, mid, left, right) + sum(2 * node + 1, mid + 1, end, left, right); | |
} | |
int main() { | |
ios_base::sync_with_stdio(0); | |
cin.tie(0); | |
cin >> n >> m >> k; | |
num.resize(n); | |
tree.resize(4 * n); | |
lazy.resize(4 * n, 0); | |
for (int i = 0; i < n; i++) | |
cin >> num[i]; | |
init(1, 0, n - 1); | |
for (int i = 0; i < m + k; i++) { | |
int a, b, c; | |
long long d; | |
cin >> a; | |
if (a == 1) { | |
cin >> b >> c >> d; | |
update_range(1, 0, n - 1, b - 1, c - 1, d); | |
} | |
else if (a == 2) { | |
cin >> b >> c; | |
cout << sum(1, 0, n - 1, b - 1, c - 1) << '\n'; | |
} | |
} | |
return 0; | |
} |
'알고리즘 문제 풀이' 카테고리의 다른 글
[백준] 2268 수들의 합 (0) | 2020.11.30 |
---|---|
[백준] 1275 커피숍2 (0) | 2020.11.29 |
[백준] 1956 운동 (0) | 2020.11.26 |
[백준] 2075 N번째 큰 수 (0) | 2020.11.08 |
[프로그래머스] 내적 (0) | 2020.11.07 |