250x250
반응형
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 |
Tags
- 11382번
- 10757번
- 10699번
- 구름알고리즘먼데이챌린지
- 알고리즘먼데이챌린지
- Java
- 14645번
- 5554번
- VeraandOutfits
- 13277번
- 자바
- 5522번
- 11283번
- 15439번
- 9654번
- 10170번
- next()과 nextLine()차이
- 설명하기힘든문제
- 2420번
- 14652번
- 5337번
- 6749번
- 5339번
- 5338번
- 11942번
- 백준
- 8370번
- 9653번
- 10926번
- 8393번
Archives
- Today
- Total
lazylazylazylazylazylazylazylazy
백준[JAVA] 1306번 달려라 홍준 본문
728x90
반응형
https://www.acmicpc.net/problem/1306
구간별 최댓값인덱스 세그먼트 트리를 만들어서 풀었습니다.
주어진 시야를 이용하여 구간 범위를 정해주었고 그 구간내의 최댓값인덱스를 반환받아 배열에 넣어 출력해줬습니다.
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 | package Solving; import java.math.BigInteger; import java.util.*; import java.lang.*; import java.io.*; import java.math.*; import java.awt.*; import java.util.List; class Solving { static int[] tree; static int[] arr; static int first; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st=new StringTokenizer(br.readLine()); int size=Integer.parseInt(st.nextToken()); int rank = Integer.parseInt(st.nextToken()); int logn=0; for(int i=1;i<size;i*=2){ logn++; } tree=new int[(int)Math.pow(2,logn+1)]; arr=new int[size+1]; arr[0]=Integer.MIN_VALUE; first=tree.length/2; st = new StringTokenizer(br.readLine()); for(int i=1;i<=size;i++){ int temp = Integer.parseInt(st.nextToken()); arr[i]=temp; tree[first+i-1]=i; } if(size==1){ System.out.println(arr[1]); return; } init(1); if(size==rank){ System.out.println(arr[tree[1]]); return; } StringBuilder sb=new StringBuilder(); for(int i=rank;i<=size-rank+1;i++){ int result=find(first+i-1-(rank-1),first+i-1+(rank-1)); sb.append(arr[result]+" "); } System.out.println(sb); } static int find(int start,int end){ int result=tree[start]; while(end>=start){ if(end==start){ if(arr[result]<=arr[tree[start]]){ result=tree[start]; } return result; } if(start%2==1){ if(arr[result]<=arr[tree[start]]){ result=tree[start]; } start++; } if(end%2==0){ if(arr[result]<=arr[tree[end]]){ result=tree[end]; } end--; } start/=2; end/=2; } return result; } static int init(int index){ if(index>=first/2){ if(arr[tree[index*2]]>=arr[tree[index*2+1]]){ return tree[index]=tree[index*2]; }else return tree[index]=tree[index*2+1]; } if(arr[init(index*2)]>=arr[init(index*2+1)]){ return tree[index]=tree[index*2]; }else return tree[index]=tree[index*2+1]; } } | cs |
728x90
반응형
'프로그래밍 > Break BOJ byJAVA' 카테고리의 다른 글
codetree (1) | 2023.09.05 |
---|---|
백준[JAVA] 9345번 디지털 비디오 디스크(DVDs) (0) | 2023.02.22 |
백준[JAVA] 14503 로봇청소기 + 예제2번 20번이 나오는 이유 예측(자바) (0) | 2023.01.02 |
백준[JAVA] 2468번 안전 영역 (0) | 2022.12.29 |
백준[JAVA] 2420번 사파리월드 (0) | 2022.01.17 |
Comments