일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- 가끔은_말로
- BFS
- 알고리즘
- 세그먼트 트리
- lazy propagation
- dfs
- back propagation
- DP
- 회고록
- 조합론
- dropout
- 플로이드 와샬
- 우선 순위 큐
- pytorch
- 다익스트라
- 2023
- 문자열
- 크루스칼
- 너비 우선 탐색
- Overfitting
- tensorflow
- 가끔은 말로
- 이분 탐색
- c++
- 백트래킹
- NEXT
- 미래는_현재와_과거로
- 자바스크립트
- object detection
- 분할 정복
Archives
- Today
- Total
Doby's Lab
[자료구조] 백준 6218번: Balanced Lineup (C++) 본문
https://www.acmicpc.net/problem/6218
최댓값 세그 트리랑 최솟값 세그 트리를 구현하고, 쿼리마다 최댓값과 최솟값을 빼주면 되는 간단한 문제였다.
[AC 코드]
#include <iostream>
#include <cmath>
#define MAX (50000 + 1)
#define ll long long
#define INF 1000000 + 1
using namespace std;
// 1 <= height <= 1000000
int arr[MAX];
int minTree[MAX * 4];
int maxTree[MAX * 4];
int n, q;
int minInit(int start, int end, int node) {
if (start == end) {
return minTree[node] = arr[start];
}
int mid = (start + end) >> 1;
return minTree[node] = min(minInit(start, mid, node * 2), minInit(mid + 1, end, node * 2 + 1));
}
int maxInit(int start, int end, int node) {
if (start == end) {
return maxTree[node] = arr[start];
}
int mid = (start + end) >> 1;
return maxTree[node] = max(maxInit(start, mid, node * 2), maxInit(mid + 1, end, node * 2 + 1));
}
int maxQuery(int start, int end, int node, int left, int right) {
if (start > right || end < left) return 0;
if (left <= start && end <= right) {
return maxTree[node];
}
int mid = (start + end) / 2;
return max(maxQuery(start, mid, node * 2, left, right), maxQuery(mid + 1, end, node * 2 + 1, left, right));
}
int minQuery(int start, int end, int node, int left, int right) {
if (start > right || end < left) return INF;
if (left <= start && end <= right) {
return minTree[node];
}
int mid = (start + end) / 2;
return min(minQuery(start, mid, node * 2, left, right), minQuery(mid + 1, end, node * 2 + 1, left, right));
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin >> n >> q;
for (int i = 1; i <= n; i++) {
cin >> arr[i];
}
minInit(1, n, 1);
maxInit(1, n, 1);
for (int i = 0; i < q; i++) {
int a, b;
cin >> a >> b;
cout << maxQuery(1, n, 1, a, b) - minQuery(1, n, 1, a, b) << '\n';
}
return 0;
}
728x90
'PS > BOJ' 카테고리의 다른 글
[알고리즘] 백준 1306번: 달려라 홍준 (C++), 슬라이딩 윈도우 (0) | 2021.12.13 |
---|---|
[자료구조] 백준 18436번: 수열과 쿼리 37 (C++) (0) | 2021.12.13 |
[자료구조] 백준 12837번: 가계부 (Hard) (C++) (0) | 2021.12.13 |
[알고리즘] 백준 5941번: Meeting Place (C++) (0) | 2021.12.13 |
[알고리즘] 백준 3584번: 가장 가까운 공통 조상 (C++) (0) | 2021.12.13 |