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
- JUnit 5
- Network
- 시뮬레이션
- 스택
- 백준
- Effective Java
- CS
- swea
- 그리디
- 백트래킹
- 유니온 파인드
- 위상정렬
- 이분탐색
- 투 포인터
- java
- 완전탐색
- Kotlin
- mst
- 플로이드-와샬
- 세그먼트 트리
- 프로그래머스
- 문자열
- 알고리즘
- 수학
- dfs
- 구현
Archives
반갑습니다!
[백준] 1275 커피숍2 본문
풀이
세그먼트 트리 기본 문제다. 세그먼트 트리를 통해 쉽게 해결할 수 있다.
코드
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> | |
#include <algorithm> | |
using namespace std; | |
int n, q; | |
vector<long long> num, tree; | |
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(int node, int start, int end, int idx, long long diff) { | |
if (idx < start || idx > end) return; | |
tree[node] += diff; | |
if (start != end) { | |
int mid = (start + end) / 2; | |
update(2 * node, start, mid, idx, diff); | |
update(2 * node + 1, mid + 1, end, idx, diff); | |
} | |
} | |
long long sum(int node, int start, int end, int left, int right) { | |
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 >> q; | |
num.resize(n + 1); | |
tree.resize(4 * (n + 1)); | |
for (int i = 1; i <= n; i++) | |
cin >> num[i]; | |
init(1, 1, n); | |
for (int i = 0; i < q; i++) { | |
int x, y, a; | |
long long b; | |
cin >> x >> y >> a >> b; | |
if (x > y) swap(x, y); | |
cout << sum(1, 1, n, x, y) << '\n'; | |
update(1, 1, n, a, b - num[a]); | |
num[a] = b; | |
} | |
return 0; | |
} |
'알고리즘 문제 풀이' 카테고리의 다른 글
[백준] 5676 음주 코딩 (0) | 2020.12.02 |
---|---|
[백준] 2268 수들의 합 (0) | 2020.11.30 |
[백준] 10999 구간 합 구하기 2 (0) | 2020.11.29 |
[백준] 1956 운동 (0) | 2020.11.26 |
[백준] 2075 N번째 큰 수 (0) | 2020.11.08 |