코딩/백준 문제 풀이

BOJ 2357 - 최솟값과 최댓값

stonejjun 2020. 4. 14. 20:42

문제 태그 : https://www.acmicpc.net/problem/2357

문제 소개 

N개의 숫자들이 주어지고 쿼리가 주어진다. 쿼리가 a,b가 주어지면 a번째 숫자부터 b번째 숫자 사이의 최솟값과 최댓값을 구해야 한다. 

문제 풀이

 지금은 N개의 숫자들이 바뀌지는 않지만, 아무튼 구간의 최댓값과 구간의 최솟값은 Segment Tree를 사용함으로써 한 번 구하는 데 $O(lgN)$에 구할 수 있음이 잘 알려져 있다.
 구간합을 구할 때 구하고자 하는 구간에 포함되어지지 않는 노드는 0을 반환한다. 항등원이기 때문이다. 같은 이유로 최솟값 세그트리에서는 항등원인 inf를 반환해야 하고, 최댓값연산에서는 항등원이 -inf이므로 구간이 포함되어지지 않으면 -inf를 반환해야 한다. 

코드

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
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int tree[maxn*4];
int tree2[maxn*4];
int arr[maxn];
int n,m;
long long init(int node, int start,int end)
{
    if(start==endreturn tree[node]=arr[start];
    else return tree[node]=min( init(node*2,start,(start+end)/2),
                                init(node*2+1,(start+end)/2+1,end) );
}
 
long long init2(int node, int start,int end)
{
    if(start==endreturn tree2[node]=arr[start];
    else return tree2[node]=max( init2(node*2,start,(start+end)/2),
                                 init2(node*2+1,(start+end)/2+1,end) );
}
 
long long mingap(int node,int st,int en, int l,int r)
{
    if(r<st || l>en ) return 1000000009;
    if(l<=st&&en<=r) return tree[node];
    return min ( mingap( node*2, st, (st+en)/2, l, r),
                 mingap( node*2+1, (st+en)/2+1, en,l,r) ) ;
}
 
long long maxgap(int node,int st,int en, int l,int r)
{
    if(r<st || l>en ) return 0;
    if(l<=st&&en<=r) return tree2[node];
    return max(maxgap( node*2, st, (st+en)/2, l, r),
               maxgap( node*2+1, (st+en)/2+1, en,l,r) ) ;
}
 
int main()
{
    int i,j,k;
    scanf("%d",&n);
    scanf("%d",&m);
    
    for(i=1;i<=n;i++)
        scanf("%d",&arr[i]);
    init(1,1,n);
    init2(1,1,n);
    while(m--)
    {
        int t2,t3;
        scanf("%d %d",&t2,&t3);
        printf("%lld %lld\n",mingap(1,1,n,t2,t3),maxgap(1,1,n,t2,t3));
    }
    return 0;    
}
Colored by Color Scripter

 

'코딩 > 백준 문제 풀이' 카테고리의 다른 글

BOJ 10067 - 수열 나누기  (0) 2020.04.16
BOJ 7578 공장  (0) 2020.04.14
BOJ 1761 - 정점들의 거리  (0) 2020.04.13
BOJ 1226 - 국회  (0) 2020.04.11
BOJ 2472 - 체인점  (0) 2020.04.09