본문 바로가기
Problem Solving/백준

백준 1275 : 커피숍2

by Libi 2021. 8. 14.
반응형

https://www.acmicpc.net/problem/1275

 

1275번: 커피숍2

첫째 줄에 수의 개수 N과 턴의 개수 Q가 주어진다.(1 ≤ N, Q ≤ 100,000) 둘째 줄에는 처음 배열에 들어가 있는 정수 N개가 주어진다. 세 번째 줄에서 Q+2번째 줄까지는 x y a b의 형식으로 x~y까지의 합

www.acmicpc.net

[ 문제풀이 ]

전형적인 세그먼트 트리를 이용해서 구간합을 구하는 문제이다. 세그먼트 자료구조를 공부하였다면 쉽게 해결할 수 있다.

세그먼트 트리 자료구조를 모르거나 공부하고 싶다면 아래 글을 참고하길 바란다.

https://sorjfkrh5078.tistory.com/14?category=1007493

 

세그먼트 트리(Segment Tree)

이번에 배워볼 자료구조는 세그먼트 트리(Segement Tree)이다. 최근 코딩 테스트에서 세그먼트 트리를 알고 있다면 조금 더 쉽게 해결할 수 있는 문제들이 나오고 있어서 한번 다뤄보려 한다. 세그

sorjfkrh5078.tistory.com

 

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

public class Main {
	
	static class SegTree {
		
		long[] tree;
		
		public SegTree(int N) {
			tree = new long[N << 2];
		}
		
		public long update(int idx, int node, int l, int r, int v) {
			if (l > idx || r < idx) return tree[node];
			if (l == r) return tree[node] = v;
			int mid = (l + r) >> 1;
			return tree[node] = update(idx, node * 2, l, mid, v)
					+ update(idx, node * 2 + 1, mid + 1, r, v);
		}
		
		public long query(int l, int r, int node, int nl, int nr) {
			if (nr < l || nl > r) return 0;
			if (nl <= l && r <= nr) return tree[node];
			int mid = (l + r) >> 1;
			return query(l, mid, node * 2, nl, nr)
					+ query(mid + 1, r, node * 2 + 1, nl, nr);
		}
	}
	
	public static void main(String[] args) {
		try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
				BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out))) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			int N = Integer.parseInt(st.nextToken());
			int Q = Integer.parseInt(st.nextToken());
			SegTree segTree = new SegTree(N);
			st = new StringTokenizer(br.readLine());
			for (int i = 1; i <= N; ++i) {
				int v = Integer.parseInt(st.nextToken());
				segTree.update(i, 1, 1, N, v);
			}
			
			for (int i = 0; i < Q; ++i) {
				st = new StringTokenizer(br.readLine());
				int x = Integer.parseInt(st.nextToken());
				int y = Integer.parseInt(st.nextToken());
				int a = Integer.parseInt(st.nextToken());
				int b = Integer.parseInt(st.nextToken());
				if (x > y) {
					int temp = y;
					y = x;
					x = temp;
				}
				bw.write(segTree.query(1, N, 1, x, y) + "\n");
				segTree.update(a, 1, 1, N, b);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

 

 

반응형

'Problem Solving > 백준' 카테고리의 다른 글

백준 2515 : 전시장  (0) 2021.08.17
백준 1727 : 커플 만들기  (0) 2021.08.16
백준 1300 : K번째 수  (0) 2021.08.12
백준 17244 : 아맞다우산  (0) 2021.08.11
백준 7453 : 합이 0인 네 정수  (0) 2021.08.10

댓글