Notice
Recent Posts
Recent Comments
Link
알고리즘 모음(C++)
백준 2268 - 수들의 합 7 (C++) 본문
문제 링크입니다. https://www.acmicpc.net/problem/2268 |
세그먼트 트리를 이용한 문제입니다.
더해야 하는 수들의 범위가 매우 크기에 일반적인 계산을 하면 시간초과가 생깁니다.
따라서, 세그먼트 트리를 이용해 값을 더해주면 됩니다.
자세한 것은 코드를 참고해주세요.
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <queue>
#include <cstring>
#include <string>
#include <cmath>
#define INF 987654321
using namespace std;
int N, M;
long long Index[1000001];
vector<long long> Tree;
long long segment_tree(int st, int fin, int node) {
if (st == fin) return Tree[node] = Index[st];
int mid = (st + fin) / 2;
long long left = segment_tree(st, mid, node * 2);
long long right = segment_tree(mid + 1, fin, node * 2 + 1);
return Tree[node] = (left + right);
}
long long get_sum(int node, int st, int fin, int left, int right) {
if (right < st || left > fin) return 0;
if (left <= st && right >= fin) return Tree[node];
int mid = (st + fin) / 2;
long long left_sum = get_sum(node * 2, st, mid, left, right);
long long right_sum = get_sum(node * 2 + 1, mid + 1, fin, left, right);
return (left_sum + right_sum);
}
void change_tree(int node, int st, int fin, int loc, long long diff) {
if (loc < st || loc > fin) return;
Tree[node] += diff;
if (st != fin) {
int mid = (st + fin) / 2;
change_tree(node * 2, st, mid, loc, diff);
change_tree(node * 2 + 1, mid + 1, fin, loc, diff);
}
}
void solve() {
int height = ceil(log2(N));
Tree.resize(1 << (height + 1));
segment_tree(0, N - 1, 1);
for (int i = 1; i <= M; i++) {
long long a, x, y;
scanf("%lld %lld %lld", &a, &x, &y);
if (a == 0) { // 합을 구한다.
printf("%lld\n", get_sum(1, 0, N - 1, min(x, y) - 1, max(x, y) - 1));
}
else { // 값을 바꾼다.
change_tree(1, 0, N - 1, x - 1, y - Index[x - 1]);
Index[x - 1] = y;
}
}
}
int main() {
cin.tie(0);
cout.tie(0);
cin >> N >> M;
solve();
return 0;
}
질문 및 조언은 댓글을 남겨주세요.
'백준' 카테고리의 다른 글
백준 6549 - 히스토그램에서 가장 큰 직사각형(C++) (0) | 2024.05.08 |
---|---|
백준 12837 - 가게부(Hard) (C++) (0) | 2024.05.06 |
백준 1275 - 커피숍2(C++) (2) | 2024.05.05 |
백준 11505 - 구간 곱 곱하기(C++) (0) | 2024.05.03 |
백준 10868 - 최솟값(C++) (1) | 2024.04.02 |