-
[백준] 5676 음주 코딩ALGORITHM/BOJ 2021. 2. 7. 16:55
2021-02-07
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889import java.io.BufferedReader;import java.io.InputStreamReader;import java.util.Arrays;import java.util.StringTokenizer;public class Main {public static int N, K, arr[], tree[];public static int init(int node, int start, int end) {// leaf nodeif(start == end) return tree[node] = arr[start];int mid = (start + end) / 2;return tree[node] = init(node*2, start, mid) * init(node*2+1, mid+1, end);}public static void update(int node, int start, int end, int idx, int change) {// idx out of rangeif(start > idx || end < idx) return;// leaf nodeif(start == end) {tree[node] = change;return;}// not leaf nodeif(start != end) {int mid = (start + end) / 2;update(node*2, start, mid, idx, change);update(node*2+1, mid+1, end, idx, change);tree[node] = tree[2*node] * tree[2*node+1];}}public static long multiple(int node, int start, int end, int left, int right) {// 1) left, right가 start, end 범위를 완전히 벗어났을 때if(left > end || right < start) return 1;// 2) left, right가 start, end를 완전히 포함하는 경우if(left <= start && end <= right) return tree[node];int mid = (start + end) / 2;return multiple(node*2, start, mid, left, right) *multiple(node*2+1,mid+1, end, left, right);}public static void main(String[] args) throws Exception {BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));String temp;while((temp = bf.readLine()) != null) {StringTokenizer st = new StringTokenizer(temp);N = Integer.parseInt(st.nextToken());K = Integer.parseInt(st.nextToken());arr = new int[N+1];tree = new int[N*4];st = new StringTokenizer(bf.readLine());// 루트 노드는 1부터 시작한다.for(int i = 1; i <= N; i++) {int x = Integer.parseInt(st.nextToken());if(x > 0) arr[i] = 1;else if(x < 0) arr[i] = -1;else arr[i] = 0;}// initinit(1, 1, N);StringBuilder sb = new StringBuilder();for(int i = 0; i < K; i++) {st = new StringTokenizer(bf.readLine());String order = st.nextToken();int a = Integer.parseInt(st.nextToken());int b = Integer.parseInt(st.nextToken());if(order.equals("C")) { // change arr[a] <- bif(b > 0) b = 1;else if(b < 0) b = -1;update(1, 1, N, a, b);} else { // deletelong answer = multiple(1, 1, N, a, b);if(answer > 0) sb.append("+");else if(answer < 0) sb.append("-");else sb.append("0");}}System.out.println(sb.toString());}}}cs
#문제풀이세그먼트 트리 문제이다. 일종의 구간 곱 구하기 인데, 입력값에서 받은 값 그대로 사용하면 스택오버플로우가 생긴다.
그래서 각 값을 양수/음수/0으로 나누어서 아래와 같이 입력 값을 받고, update 할 때도 양수/음수/0으로 나누어서 그 값으로 값을 변경해야한다.
양수 -> 1
음수 -> -1
0 -> 0
'ALGORITHM > BOJ' 카테고리의 다른 글
[백준] 1062 가르침 (0) 2021.02.15 [백준] 1561 놀이공원 (0) 2021.02.13 [백준] 14425 문자열 집합 (0) 2021.02.02 [백준] 1238 파티 (0) 2021.01.31 [백준] 1854 K번째 최단경로 찾기 (0) 2021.01.31