구간 분할 생성기
시간 제한1초메모리 제한128 MB
남은 집합에서 사전식 순서로 주어진 구간 번호를 해독하고 전체 구간 개수와 선택된 양 끝점을 보고합니다.
문제
집합 이 주어진다. 정수 에 대해 구간 는 연속한 정수의 집합 를 뜻한다. 를 구간들로 분할한다는 것은, 서로소인 구간들의 수열로서 그 합집합이 정확히 가 되도록 만드는 것이다.
이러한 분할을 한 단계씩 만들어 내는 생성기를 시뮬레이션한다. 매 순간, 아직 어떤 구간에도 포함되지 않은 의 원소들의 집합 를 유지한다. 처음에는 이다. 각 반복에서 에 완전히 포함되는 구간 하나를 골라 출력한 뒤 에서 제거한다. 가 공집합이 될 때까지 이를 반복한다.
각 반복에서 고르는 구간은 번호로 지정된다. 에 포함되는 모든 구간 (즉 부터 까지의 모든 정수가 에 속하는 구간)를 생각하자. 이들을 (시작점, 끝점) 쌍에 대한 사전식 순서로 번부터 번호를 매긴다. 예를 들어 일 때 구간들은 순서대로 , , , 이며 각각 번호 , , , 을 가진다. 고른 구간의 번호는 입력으로 주어진다.
입력
첫째 줄에 정수 ()이 주어진다.
이어지는 입력에는 각 반복에서 고른 구간의 번호가 순서대로 하나씩 주어진다. 에서 시작하여 가 공집합이 아닌 동안 다음을 반복한다.
- 현재 에 포함되는 구간의 개수를 이라 한다.
- 정수 (), 즉 고른 구간의 번호를 읽는다.
- 번호가 인 구간을 에서 제거한다.
주어지는 번호들은 를 정확히 비우기에 딱 맞는 개수이며, 마지막 번호를 사용한 직후 는 공집합이 된다.
출력
각 반복마다 순서대로 두 줄을 출력한다.
- 그 반복을 시작할 때 에 포함되는 구간의 개수 을 한 줄에 출력한다.
- 고른 구간 의 양 끝점 와 를 공백 하나로 구분하여 한 줄에 출력한다.