구간 그래프의 최대 클리크

시간 제한1초메모리 제한512 MB

요약
N개의 구간이 주어질 때 서로 모두 겹치는 구간의 최대 집합을 찾아 크기와 함께 사전순으로 가장 앞서는 꼭짓점 번호들을 출력한다.
난이도

보통10점 중 6점

유형
정렬, 그리디, 구간, 배열
정답자
아직 제출이 없습니다

문제

그래프 이론에서 클리크는 완전 그래프인 부분 그래프를 말한다. 즉 정점 집합 중에서 두 정점을 어떻게 골라도 그 사이에 간선이 있는 집합이다. 최대 클리크는 그런 집합 중 크기가 가장 큰 것이다. 일반적인 그래프에서 최대 클리크를 구하는 문제는 NP-hard다.

NN개의 구간이 있다. ii번 구간의 시작점은 SiS_i, 끝점은 EiE_i이며, 두 구간이 점을 하나 이상 공유하면 두 구간이 겹친다고 한다. 이 구간들로 구간 그래프를 정의한다. 구간 그래프는 정점이 NN개이고, ii번 구간과 jj번 구간이 겹칠 때만 ii번 정점과 jj번 정점 사이에 간선이 있는 그래프다. 두 구간이 겹치지 않으면 두 정점 사이에는 간선이 없다.

예를 들어 구간이 [1,3][1, 3], [3,7][3, 7], [7,10][7, 10], [2,5][2, 5]로 주어지면 구간 그래프는 다음과 같다.

이 구간 그래프의 최대 클리크는 {1,2,4}\{1, 2, 4\}다.

NN개의 구간이 주어질 때 구간 그래프의 최대 클리크를 구하시오.

입력

첫 줄에 구간의 수 NN (1≤N≤3000001 \le N \le 300000)이 주어진다. 다음 NN개의 줄에 ii번 구간의 시작점과 끝점을 나타내는 두 정수 SiS_i, EiE_i가 공백으로 구분되어 주어진다. (1≤Si<Ei≤1091 \le S_i < E_i \le 10^9)

출력

첫 줄에 최대 클리크의 크기 ss를 출력한다. 둘째 줄에는 그 클리크에 속한 정점의 번호 ss개를 번호가 증가하는 순서로 공백으로 구분해 출력한다. 최대 클리크가 여러 개면 번호를 증가하는 순서로 나열한 목록이 사전순으로 가장 앞서는 클리크 하나를 출력한다.

예제2

  1. 예제 1

    입력
    4
    1 3
    3 7
    7 10
    2 5
    
    예상 출력
    3
    1 2 4
    
  2. 예제 2

    입력
    4
    10 11
    1 2
    1 2
    10 11
    
    예상 출력
    2
    1 4