728x90
1275. 커피숍2
난이도 : 골드 1
소요 시간 : 15분
날짜 : 2025.01.08
언어 : 파이썬
알고리즘 유형 : 세그먼트 트리
설명 보기전에 문제 풀어보러 가기
1. 문제 설명
- 정수배열이 주어진다.
- x, y, a, b의 쿼리가 주어진다.
- x~y의 합을 출력하고,
- a번째 수를 b로 바꾼다.
2. 해결 방식
- 세그먼트트리 자료구조의 기본적인 문제이다.
- 세그먼트트리의 생성
- 세그먼트 트리 누적 합 구하기
- 세그먼트 트리 갱신
3. 정답 코드
import sys;input = sys.stdin.readline
def make_seg(n, arr):
seg = [0] * (4 * n)
def make(node, s, e):
if s == e:
seg[node] = arr[s]
return seg[node]
mid = (s + e) // 2
seg[node] = make(node * 2 + 1, s, mid) + make(node * 2 + 2, mid + 1, e)
return seg[node]
make(0, 0, n - 1)
return seg
def find_seg(seg, x, y, node, s, e):
if x > e or y < s: return 0
if x <= s and e <= y: return seg[node]
mid = (s + e) // 2
return find_seg(seg, x, y, node * 2 + 1, s, mid) + find_seg(seg, x, y, node * 2 + 2, mid + 1, e)
def update_seg(seg, idx, num, node, s, e):
if s== e:seg[node] = num;return
mid = (s + e) // 2
if s <= idx <= mid:
update_seg(seg, idx, num, node * 2 + 1, s, mid)
else:
update_seg(seg, idx, num, node * 2 + 2, mid + 1, e)
seg[node] = seg[node * 2 + 1] + seg[node * 2 + 2]
if __name__ == '__main__':
N, Q = map(int, input().split())
Arr = list(map(int, input().split()))
seg = make_seg(N, Arr)
for _ in range(Q):
X, Y, A, B = map(int, input().split())
print(find_seg(seg, min(X, Y) - 1, max(X, Y) - 1, 0, 0, N - 1))
update_seg(seg, A - 1, B, 0, 0, N - 1)
반응형
'백준 문제풀이 코드저장소 > Gold' 카테고리의 다른 글
Baekjoon 11066. 파일 합치기 / Python (0) | 2025.01.09 |
---|---|
Baekjoon 10986. 나머지 합 / Python (0) | 2025.01.08 |
Baekjoon 25682. 체스판 다시 칠하기 2 / Python (0) | 2025.01.06 |
Bakejoon 17471. 게리맨더링 / Python (0) | 2025.01.02 |