lazylazylazylazylazylazylazylazy

백준[JAVA] 1306번 달려라 홍준 본문

프로그래밍/Break BOJ byJAVA

백준[JAVA] 1306번 달려라 홍준

lazylazylazylazylazylazylazylazy 2023. 2. 23. 19:39
728x90
반응형

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

 

1306번: 달려라 홍준

첫째 줄에는 뛰는 코스의 길이, 즉 칸수 N과 홍준이의 시야의 범위 M이 주어진다. 시야가 M이라고 하면 현재 위치에서 앞뒤로 M-1칸까지 광고판이 보이는 것이다. (1 ≤ M ≤ N ≤ 1,000,000) 두 번째

www.acmicpc.net

 

 

구간별 최댓값인덱스 세그먼트 트리를 만들어서 풀었습니다.

주어진 시야를 이용하여 구간 범위를 정해주었고 그 구간내의 최댓값인덱스를 반환받아 배열에 넣어 출력해줬습니다.

 

 

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
반응형
Comments