백준 2357 최솟값과 최댓값

치즈·2022년 10월 6일

BOJ

목록 보기
4/45

세그먼트 트리를 이용해 풀 수 있었던 문제.
이 때, 최솟값트리 minTree와 최댓값트리 maxTree를 각각 계산했다.
코드는 다음과 같다.

#include <iostream>
#include <vector>
#define BIG 1e9;
#define SMALL -1;
using namespace std;

vector<long long> arr;
vector<long long> minTree;
vector<long long> maxTree;
vector<pair<int, int>> query;

int N;
int M;

long long Min(long long a, long long b){
  return a < b? a : b;
}

long long Max(long long a, long long b){
  return a > b? a : b;
}


long long init_minTree(int start, int end, int node){
  if(start == end) return minTree[node] = arr[start];
  int mid = (start + end)/2;
  minTree[node] = Min(init_minTree(start, mid, node * 2), init_minTree(mid + 1, end, node * 2 + 1));
  return minTree[node];
}

long long init_maxTree(int start, int end, int node){
  if(start == end) return maxTree[node] = arr[start];
  int mid = (start + end)/2;
  maxTree[node] = Max(init_maxTree(start, mid, node * 2) , init_maxTree(mid + 1, end, node * 2 + 1));
  return maxTree[node];
}

long long query_minTree(int start, int end, int node, int left, int right){
  if(left > end || right < start) return BIG;
  if(left <= start && right >= end) return minTree[node];
  int mid = (start + end)/2;
  return Min(query_minTree(start, mid, node * 2, left, right), query_minTree(mid + 1, end, node * 2 + 1, left, right));
}

long long query_maxTree(int start, int end, int node, int left, int right){
  if(left > end || right < start) return SMALL;
  if(left <= start && right >= end) return maxTree[node];
  int mid = (start + end)/2;
  return Max(query_maxTree(start, mid, node * 2, left, right), query_maxTree(mid + 1, end, node * 2 + 1, left, right));
}

void input(){
  cin >> N >> M;
  arr.resize(N, 0);
  minTree.resize(N * 4, 0);
  maxTree.resize(N * 4, 0);
  
  for(int i = 0; i < N; i++){
    cin >> arr[i];
  }
  for(int i = 0; i < M; i++){
    int a, b;
    cin >> a >> b;
    query.push_back({a,b});
  }
}

void solve(){
  for(int i = 0; i < M; i++){
    int a = query[i].first - 1;
    int b = query[i].second - 1;
    cout << query_minTree(0, N-1, 1, a, b) << " " << query_maxTree(0, N-1, 1, a, b) << "\n";
  }
}
int main() {
  ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
  input();
  init_minTree(0, N-1, 1);
  init_maxTree(0, N-1, 1);
  solve();
  return 0;
}

profile
차근차근 배워나가요

0개의 댓글