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
- COSPRO
- 다이나믹프로그래밍
- 엘라스틱서치
- 완전탐색
- PS
- dp
- 이젠 골드구현도 어렵네..
- QUICKSTARTGUIDE
- 네트워크플로우
- 우선순위큐
- 다익스트라
- COSPROJAVA1급
- spring
- 01BFS
- 세그먼트트리
- 재귀함수
- 구현
- deque
- 취득후기
- 알고리즘
- 백준
- GatherTown
- 게더타운시작
- DFS
- BFS
- 백준코딩테스트
- 자바PS
- 시뮬레이션
- YBMCOS
- java
Archives
- Today
- Total
공부공간
BOJ -2268 ) 수들의 합 본문
https://www.acmicpc.net/problem/2268
세그먼트트리의 기본꼴인 연속합을 구하는 문제이다.
세그먼트트리는 O(NM)의 시간복잡도를 O(LogN)으로 줄여주는 자료구조이다.
기본예제를 충분히 연습하고 Fenwick 트리로 넘어가야겠다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class 수들의합 {
public static long number[] , seg[];
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
StringBuilder sb = new StringBuilder();
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
int size = (int) Math.pow(2, 1+Math.ceil(Math.log10(n) / Math.log10(2)));
number = new long[n];
seg = new long[size];
for(int i = 0 ; i < m ; i ++) {
st = new StringTokenizer(br.readLine());
int order = Integer.parseInt(st.nextToken());
if(order ==1) {
// modify
int t = Integer.parseInt(st.nextToken())-1;
int c = Integer.parseInt(st.nextToken());
long d = c-number[t];
number[t] = c;
Modify(1 , 0 , n-1 , t , d);
} else {
//sum
int s = Integer.parseInt(st.nextToken())-1;
int e = Integer.parseInt(st.nextToken())-1;
if(e < s) {int t = s; s = e ; e =t;}
sb.append(sum(1,0,n-1,s,e)+ "\n");
}
}System.out.println(sb);
}
private static void Modify(int node, int start, int end, int tar, long diff) {
if(tar > end || start > tar) {
return ;
}
seg[node] += diff;
if(start != end) {
Modify(2*node, start, (start+end)>>1, tar, diff);
Modify(2*node+1, ((start+end)>>1)+1, end, tar, diff);
}
}
private static long sum(int node, int start, int end, int left, int right) {
if(left > end || start > right) {
return 0;
} else if(left <= start && end <= right){
return seg[node];
} else {
return sum (2*node , start , (start+end)>>1 , left , right ) + sum( 2*node+1 , ((start+end)>>1)+1 , end , left, right);
}
}
}
'알고리즘 > SegmentTree' 카테고리의 다른 글
BOJ - 1306 ) 달려라 홍준 (0) | 2021.07.27 |
---|---|
BOJ - 6549 ) 히스토그램에서 가장 큰 직사각형 (0) | 2020.10.28 |
BOJ - 10868 ) 최솟값 (0) | 2020.05.16 |
BOJ - 2357 ) 최솟값과 최댓값 (0) | 2020.05.16 |
BOJ - 1275 ) 커피숍2 (0) | 2020.05.16 |
Comments