아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

단체 여행

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

요약
각 관광객의 두 방문 소원을 모두 만족하는 도시 목록이 있는지 판단하고 사전 순으로 가장 작은 목록을 출력합니다.
난이도

보통10점 중 7점

유형
그래프, DFS, 위상 정렬, 그리디
정답자
아직 제출이 없습니다

문제

한 관광객 그룹이 여러 아름다운 도시를 방문할 기회를 얻었습니다. 그룹의 각 참가자는 도시 두 개를 지정하고, 각 도시에 대해 그곳을 방문하고 싶은지 아니면 방문하고 싶지 않은지를 말합니다. 한 관광객이 같은 도시를 두 번 지정하여, 한 번은 방문하고 싶다고 하고 다른 한 번은 방문하고 싶지 않다고 말할 수도 있습니다.

다음을 수행하는 프로그램을 작성하세요.

  • 표준 입력에서 관광객들이 지정한 내용을 읽어들입니다.
  • 모든 관광객의 소원 중 적어도 하나가 이루어지도록 방문할 도시 목록(빈 목록일 수도 있음)을 만들 수 있는지 판단합니다.
  • 모든 관광객을 만족시키는 도시 목록을 표준 출력으로 내보냅니다.

입력

첫 번째 줄에는 양의 정수 두 개 nn과 mm (1≤n≤20 0001 \le n \le 20\,000, 1≤m≤8 0001 \le m \le 8\,000)이 주어집니다. nn은 관광객의 수이고 mm은 도시의 수입니다. 관광객은 11번부터 nn번까지, 도시는 11번부터 mm번까지 번호가 매겨져 있습니다.

이어지는 nn개의 줄에는 각각 00이 아닌 정수 두 개가 공백 하나로 구분되어 주어집니다. 그중 ii번째 줄에는 ii번 관광객의 소원을 나타내는 두 정수 wiw_i와 wi′w'_i가 있으며, −m≤wi≤m-m \le w_i \le m, −m≤wi′≤m-m \le w'_i \le m, wi≠0w_i \ne 0, wi′≠0w'_i \ne 0을 만족합니다. 양수는 그 번호의 도시를 방문하고 싶다는 뜻이고, 음수는 그 절댓값에 해당하는 번호의 도시를 방문하고 싶지 않다는 뜻입니다.

출력

첫 번째 줄에는 방문할 도시의 개수를 나타내는 음이 아닌 정수 ll 하나를 출력합니다. 두 번째 줄에는 모든 관광객을 만족시키기 위해 방문해야 하는 도시의 번호 ll개를 오름차순으로 출력합니다. l=0l = 0인 경우 첫 번째 줄에 00을 출력하고 두 번째 줄은 빈 줄로 둡니다.

모든 관광객을 만족시키는 도시 목록(빈 목록 포함)을 만들 수 없는 경우에는 첫 번째이자 유일한 줄에 NO를 출력합니다.

조건을 만족시키는 도시 목록이 여러 개인 경우에는 사전순으로 가장 작은 목록 하나만 출력합니다. 구체적으로, 답을 이진 문자열 b1b2…bmb_1 b_2 \dots b_m으로 나타내되 도시 jj를 방문하면 bj=1b_j = 1, 방문하지 않으면 bj=0b_j = 0이라 하고 00이 11보다 작다고 간주합니다. 유효한 모든 답 중에서 문자열 b1b2…bmb_1 b_2 \dots b_m이 사전순으로 가장 작은 것을 고릅니다. 이는 도시를 11번부터 mm번까지 차례로 살펴보면서, 남은 도시들을 적절히 선택해 여전히 모든 관광객을 만족시킬 수 있는 한 각 도시를 방문하지 않는 쪽으로 두는 것과 같습니다. 그런 다음 방문하는 도시들을 오름차순으로 출력합니다.

예제3

  1. 예제 1

    입력
    3 4
    1 -2
    2 4
    3 1
    
    예상 출력
    2
    3 4
    
  2. 예제 2

    입력
    1 1
    1 1
    
    예상 출력
    1
    1
    
  3. 예제 3

    입력
    2 1
    1 1
    -1 -1
    
    예상 출력
    NO