일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- dropout
- 자바스크립트
- 우선 순위 큐
- object detection
- 2023
- 가끔은 말로
- pytorch
- 세그먼트 트리
- Overfitting
- 크루스칼
- DP
- lazy propagation
- c++
- BFS
- 미래는_현재와_과거로
- 백트래킹
- NEXT
- 분할 정복
- 가끔은_말로
- 알고리즘
- 회고록
- 이분 탐색
- dfs
- 조합론
- 다익스트라
- 플로이드 와샬
- 너비 우선 탐색
- back propagation
- 문자열
- tensorflow
Archives
- Today
- Total
Doby's Lab
[알고리즘] 백준 1306번: 달려라 홍준 (C++), 슬라이딩 윈도우 본문
https://www.acmicpc.net/problem/1306
이번 문제는 문제에서 "가장 강렬한 빛의 광고판만이 눈에 들어온다."라는 말에서 구간 최댓값 세그 트리를 짜주면 되는 문제였다.
다만 어떤 구간인지에 관해서는 "슬라이딩 윈도우"라는 알고리즘(?)이 튀어나왔었다.
잠깐 구글링 해봤는데 알고리즘이라 하긴 그렇고, 테크닉(?) 같은 느낌이다.
따로 설명은 하지 않겠다. (나중에 어려움을 겪으면 그때 정리하겠다.)
시야 M이 주어지면 앞뒤로 M - 1, M + 1 사이의 빛을 볼 수 있다고 주어져있다. (1 ~ N 구간 사이)
그러면 탐색하는 구간은 이렇게 된다.
for (int i = m; i <= n - m + 1; i++) {
cout << query(1, n, 1, i - m + 1, i + m - 1) << ' ';
}
M부터 시작하여 N - M + 1까지
쿼리의 범위는 [(i - (M - 1)), (i + (M - 1))]이렇게 된다.
문제에서 어차피 범위를 다 주기 때문에 어려움을 겪을 필요는 없다.
감이 잡히긴 하는데 조금 더 감을 잡을 시간이 필요하다.
[AC 코드]
#include <iostream>
#include <cmath>
#define MAX (1000000 + 1)
using namespace std;
int arr[MAX];
int sgTree[MAX * 4];
int n, m;
int sgInit(int start, int end, int node) {
if (start == end) {
return sgTree[node] = arr[start];
}
int mid = (start + end) >> 1;
return sgTree[node] = max(sgInit(start, mid, node * 2),
sgInit(mid + 1, end, node * 2 + 1));
}
int query(int start, int end, int node, int left, int right) {
if (start > right || end < left) return 0;
if (left <= start && end <= right) return sgTree[node];
int mid = (start + end) >> 1;
return max(query(start, mid, node * 2, left, right),
query(mid + 1, end, node * 2 + 1, left, right));
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cin >> arr[i];
}
sgInit(1, n, 1);
for (int i = m; i <= n - m + 1; i++) {
cout << query(1, n, 1, i - m + 1, i + m - 1) << ' ';
}
return 0;
}
728x90
'PS > BOJ' 카테고리의 다른 글
[알고리즘] 백준 5590번: 船旅 (C++) (0) | 2021.12.13 |
---|---|
[알고리즘] 백준 13116번: 30번 (C++) (0) | 2021.12.13 |
[자료구조] 백준 18436번: 수열과 쿼리 37 (C++) (0) | 2021.12.13 |
[자료구조] 백준 6218번: Balanced Lineup (C++) (0) | 2021.12.13 |
[자료구조] 백준 12837번: 가계부 (Hard) (C++) (0) | 2021.12.13 |