※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 17619번 문제인 개구리 점프이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/17619
17619번: 개구리 점프
첫 번째 줄에 통나무 개수 N과 질문의 개수 Q가 주어진다. 다음 N개의 줄에 각 통나무에 x1, x2, y의 세 정수 좌표가 주어진다. 주어진 통나무는 두 점 (x1, y)와 (x2, y)를 잇는 형태이다. (x1 < x2) 모든
www.acmicpc.net
주어진 통나무들을 왼쪽 끝 좌표 순서대로 먼저 정렬하자. 그리고 차례대로 읽어나가면서 이번 통나무가 이전에 등장한 통나무와 겹치는지를 확인해나가자. 이 때 매 차례마다 그 때까지 확인한 통나무의 오른쪽 끝이 어디인지를 기록해나가면 이전에 등장한 통나무와 겹치는지를 쉽게 확인할 수 있다.
이제 겹치는 통나무들 사이의 관계를 집합으로 생각해 주어진 문제를 disjoint set 자료구조를 이용해 간단하게 해결하자.
아래는 제출한 소스코드이다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int arr[100001];
int findf(int x) {
if (x == arr[x]) return x;
return arr[x] = findf(arr[x]);
}
int N, Q;
pair<pair<int, int>, int> logs[100000];
int cur = -1, R = -1;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> N >> Q;
for (int i = 1; i <= N; i++) arr[i] = i;
for (int i = 0; i < N; i++) {
cin >> logs[i].first.first >> logs[i].first.second >> logs[i].second;
logs[i].second = i + 1;
}
sort(logs, logs + N);
for (int i = 0; i < N; i++) {
if (R < logs[i].first.first) cur = logs[i].second, R = logs[i].first.second;
else R = max(R, logs[i].first.second), arr[logs[i].second] = cur;
}
while (Q--) {
int x, y; cin >> x >> y;
cout << (findf(x) == findf(y)) << '\n';
}
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 13268 // C++] 셔틀런 (1) | 2024.02.19 |
---|---|
[BOJ 2986 // C++] 파스칼 (0) | 2024.02.18 |
[BOJ 18115 // C++] 카드 놓기 (2) | 2024.02.16 |
[BOJ 29543 // C++] Smooth numbers (0) | 2024.02.15 |
[BOJ 29542 // C++] Wipe it! (1) | 2024.02.14 |