Link


https://www.acmicpc.net/problem/17619

Detail


여러개의 가로 통나무를 왔다갔다 하면서, a번 통나무와 b번 통나무 사이를 도달 할 수 있는 지 묻는 문제이다.

문제의 형태가 여러개의 수직선이 놓여있고, 이들이 y값에 관계없을 때 연결되는지를 판단하는 문제였기에 자연스럽게 스위핑을 떠올리게 되었다.

내 관점에서 스위핑은 여러개의 수직선을 하나로 통합하는 행위라고 느끼게 되어서, 해당 알고리즘을 바로 적용했다.

스위핑을 위해서 시작점 정렬을 할 경우 기존 통나무의 번호를 잃어버린다는 점을 알아내지 못해서 두번의 WA를 받았지만, 해당 부분 해결 후에 AC를 받아냈다.

Code


#include <bits/stdc++.h>  
  
using namespace std;  
  
int main() {  
    // fast io  
    ios_base::sync_with_stdio(false);  
    cin.tie(nullptr);  
    cout.tie(nullptr);  
  
    int woods_cnt;  
    int q_cnt;  
  
    cin >> woods_cnt >> q_cnt;  
  
    vector<tuple<int, int, int>> woods(woods_cnt);  
    vector<int> group(woods_cnt); // group[i] = i번째 나무가 속한 그룹 번호  
  
    int x1, x2, y;  
    for(int i = 0; i < woods_cnt; i++) {  
       cin >> x1 >> x2;  
       woods[i] = {x1, x2, i};  
       cin >> y; // y는 입력받고 버림. 스위핑 해버릴꺼라서  
    }  
  
    sort(woods.begin(), woods.end());  
    int group_num = 0, last_position = -1;  
    for(int i = 0; i < woods_cnt; i++) {  
       auto [left, right, idx] = woods[i];  
  
       // 끊어져있다면 다음 그룹으로 그룹 증가  
       if(left > last_position) {  
          group_num++;  
       }  
       group[idx] = group_num;  
       last_position = max(last_position, right);  
    }  
  
    for(int i = 0; i < q_cnt; i++) {  
       int a, b;  
       cin >> a >> b;  
  
       cout << ((group[a - 1] == group[b - 1]) ? 1 : 0) << '\n';  
    }  
}