PS

BOJ 10165 : 버스 노선

lickelon 2024. 9. 11. 22:31
  • 문제 링크 : boj.kr/10165
  • 난이도 : P5
  • 태그 : 정렬, 스위핑

코드

#include <bits/stdc++.h>

#define all(x) (x).begin(), (x).end()

#define INF 0x7FFFFFFF

using namespace std;

using ll = long long;
using ld = long double;
using pii = pair<int,int>;
using pll = pair<ll, ll>;

struct route {
    ll s;
    ll e;
    int idx;
    route(ll _s, ll _e, int _idx) : s(_s), e(_e), idx(_idx) {}
};

bool comp(route &a, route &b) {
    if(a.s == b.s) return a.e > b.e;
    return a.s < b.s;
}

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);

    int n, m;
    cin >> n >> m;
    vector<bool> check(m+1, true);
    vector<route> routes;
    for(int i = 1; i <= m; i++) {
        ll a, b;
        cin >> a >> b;
        if(b < a) b += n;
        routes.emplace_back(a, b, i);
        routes.emplace_back(a+n, b+n, i);
    }
    sort(all(routes), comp);
    ll M = 0;
    for(int i = 0; i < routes.size(); i++) {
        if(routes[i].e <= M) {
            check[routes[i].idx] = false;
        }
        M = max(M, routes[i].e);
    }

    for(int i = 1; i <= m; i++) {
        if(check[i]) cout << i << " ";
    }

    return 0;
}

풀이

원으로 주어진 입력을 직선으로 만들어준다.

원으로 된 입력은 두 바퀴를 돌리면 직선처럼 생각할 수 있다.

이후에 출발점을 기준으로 오름차순, 출발점이 같다면 도착점을 기준으로 내림차순으로 정렬한다.

정렬했을 때 어떤 노선 i가 이전의 이전 노선들 도착점의 최댓값보다 작다면 포함되는 노선이므로 제거하면 된다.

728x90