순열 그래프의 연결성 판별
시간 제한2초메모리 제한256 MB
길이 100만 이하인 순열에서 i < j이고 a_i > a_j일 때 i와 j를 잇는 그래프의 연결 성분을 모두 구합니다.
문제
크기가 인 순열은 부터 까지의 정수가 정확히 한 번씩 등장하는 길이 의 수열이다. 이 순열을 이라고 하자.
순열 로부터 다음과 같이 순열 그래프를 만든다. 순열 그래프는 번 정점으로 이루어진 무방향 그래프이며, 두 정점 , ()는 일 때 간선으로 연결된다.
이 순열 그래프의 연결 요소(connected component)를 모두 구하려고 한다. 정점을 번호가 작은 쪽부터 큰 쪽으로 살펴보다가 아직 방문하지 않은 정점을 만나면, 그 정점에서 도달할 수 있는 모든 정점을 함께 모아 하나의 집합(연결 요소)으로 묶는다.
이 최대 까지 커질 수 있어 간선 수가 에 이를 수 있으므로, 모든 간선을 만들어 단순한 깊이 우선 탐색을 수행하면 시간 안에 끝나지 않는다. 순열의 구조를 이용하여 연결 요소를 효율적으로 구하라.
입력
첫째 줄에 순열의 길이 ()이 주어진다.
둘째 줄에 공백으로 구분된 개의 정수가 주어지며, 이는 순열의 원소 을 나타낸다.
출력
첫째 줄에 연결 요소의 개수 을 출력한다.
이어지는 개의 줄에 각 연결 요소를 출력한다. 각 줄에는 먼저 그 요소에 속한 정점의 개수 를 출력하고, 이어서 그 요소에 속한 개의 정점 번호를 오름차순으로 공백으로 구분하여 출력한다.
여러 연결 요소를 출력할 때에는, 각 요소에 속한 가장 작은 정점 번호를 기준으로 오름차순으로 정렬하여 출력한다.
힌트
아래 그림은 첫 번째 예제의 순열로 만든 순열 그래프를 나타낸다.
