알고리즘 문제/[백준]

[백준] 13334 철로

latter2005 2021. 1. 14. 21:02

문제 주소 : www.acmicpc.net/problem/13334

 

13334번: 철로

입력은 표준입력을 사용한다. 첫 번째 줄에 사람 수를 나타내는 양의 정수 n (1 ≤ n ≤ 100,000)이 주어진다. 다음 n개의 각 줄에 정수 쌍 (hi, oi)가 주어진다. 여기서 hi와 oi는 −100,000,000이상, 100,000,0

www.acmicpc.net

fast io 미적용

문제 확인

 

스위핑과 우선순위 큐를 활용하는 문제입니다.

 

풀이

 

입력받은 선들을 x기준으로 내림차순 정렬을 한 후 우선순위 큐에 y 값을 내림차순으로 넣어 비교합니다.

비교식은 ary[i].x + dist < que.top() => que.pop() 이며 이러한 동작으로 인해 현재 이 조건을 만족하게 된다면 다음 단계에서 의미 없는 값이 되기 때문에 버립니다.

x값이 내림차순으로 정렬되어 있기 때문에 현재 비교식을 만족하지 못한다면 x값이 더 작은 다음 식을 절때 만족할 수 없기 때문에 pop으로 버려도 무방하기 때문입니다

이러한 식으로 끝까지 탐색을 하면서 최대값을 찾습니다.

 

코드

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
32
33
34
#include <cstdio>
#include <algorithm>
#include <queue>
using namespace std;
typedef struct node {
    int x, y;
    bool operator<(const node &b) const {
        return x > b.x;
    }
}node;
int main() {
    node ary[100000];
    int n, d, max = 0;
    scanf("%d"&n);
    for (int i = 0; i < n; i++) {
        int x, y;
        scanf("%d%d"&x, &y);
        if (x < y)
            ary[i] = { x, y };
        else
            ary[i] = { y, x };
    }
    scanf("%d"&d);
    sort(ary, ary + n);
    priority_queue<intvector<int>, less<int>> que;
    for (int i = 0; i < n; i++) {
        que.push(ary[i].y);
        while (!que.empty() && ary[i].x + d < que.top())que.pop();
        max = que.size() > max ? que.size() : max;
    }
 
 
    printf("%d", max);
}
cs
반응형

'알고리즘 문제 > [백준]' 카테고리의 다른 글

[백준] 1019 책 페이지  (0) 2021.01.18
[백준] 1086 박성원  (0) 2021.01.15
[백준] 9376 탈옥  (0) 2021.01.12
[백준] 14891 톱니바퀴  (0) 2021.01.10
[백준] 1444 숌 언어  (0) 2021.01.07