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 |
Tags
- 이젠 골드구현도 어렵네..
- COSPROJAVA1급
- 게더타운시작
- deque
- 백준코딩테스트
- spring
- 다이나믹프로그래밍
- 네트워크플로우
- 엘라스틱서치
- 구현
- 완전탐색
- PS
- 세그먼트트리
- YBMCOS
- 취득후기
- 알고리즘
- BFS
- QUICKSTARTGUIDE
- 자바PS
- 01BFS
- GatherTown
- 우선순위큐
- DFS
- 재귀함수
- 다익스트라
- java
- 백준
- dp
- COSPRO
- 시뮬레이션
Archives
- Today
- Total
공부공간
BOJ - 1306 ) 달려라 홍준 본문
https://www.acmicpc.net/problem/1306
길이가 N인 수열에서, 내가 현재있는 index 에서 [index-(M-1) , index+(M-1)] 에서 가장 큰 값을 찾으면 된다.
N = 100만 이므로, N^2의 풀이보다는 NlogN의 풀이인 세그먼트 트리를 이용하여,
N개의 쿼리를 처리해주자, 위문제는 O(NlogN+N) 에 처리가 가능하다.
즉, 구간의 최댓값을 저장하는 배열을 세그먼트 트리로 만들면 된다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.util.concurrent.SynchronousQueue;
public class Main {
public static long seg[] , arr[];
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
st = new StringTokenizer(br.readLine());
arr = new long[n];
for(int i=0;i<n;i++) {arr[i] = Long.parseLong(st.nextToken());}
seg = new long[4*n];
seginit(1,0,n-1);
StringBuilder sb = new StringBuilder();
for(int start=m-1 ; start <= n-m; start++) {
sb.append(find(1,0,n-1,start-(m-1),start+(m-1))+" ");
}
System.out.print(sb);
}
private static long seginit(int node, int s, int e ) {
if(s==e) {return seg[node]= arr[s];}
int mid = (s+e)/2;
return seg[node] = max (seginit(2*node ,s,mid) , seginit(2*node+1,mid+1, e));
}
private static long max(long a, long b) {
return a >= b ? a : b;
}
private static long find(int node , int s , int e , int left , int right) {
if(right < s || left > e) return -1;
else if(left <= s && e <= right) {
return seg[node];
}
else {
int mid = (s+e)/2;
return max(find(node*2 ,s, mid,left,right),find(node*2+1, mid+1 , e , left , right));
}
}
}
'알고리즘 > SegmentTree' 카테고리의 다른 글
BOJ - 12846 ) 무서운 아르바이트 (0) | 2021.07.28 |
---|---|
BOJ - 6549 ) 히스토그램에서 가장 큰 직사각형 (0) | 2020.10.28 |
BOJ -2268 ) 수들의 합 (0) | 2020.05.17 |
BOJ - 10868 ) 최솟값 (0) | 2020.05.16 |
BOJ - 2357 ) 최솟값과 최댓값 (0) | 2020.05.16 |
Comments