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

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

순열 그래프의 연결성 판별

시간 제한2초메모리 제한256 MB

요약
길이 100만 이하인 순열에서 i < j이고 a_i > a_j일 때 i와 j를 잇는 그래프의 연결 성분을 모두 구합니다.
난이도

보통10점 중 7점

유형
스택, 그리디, 그래프, 배열
정답자
아직 제출이 없습니다

문제

크기가 nn인 순열은 11부터 nn까지의 정수가 정확히 한 번씩 등장하는 길이 nn의 수열이다. 이 순열을 a1,a2,…,ana_1, a_2, \dots, a_n 이라고 하자.

순열 aa로부터 다음과 같이 순열 그래프를 만든다. 순열 그래프는 1,2,…,n1, 2, \dots, n번 정점으로 이루어진 무방향 그래프이며, 두 정점 ii, jj (1≤i<j≤n1 \le i < j \le n)는 ai>aja_i > a_j 일 때 간선으로 연결된다.

이 순열 그래프의 연결 요소(connected component)를 모두 구하려고 한다. 정점을 번호가 작은 쪽부터 큰 쪽으로 살펴보다가 아직 방문하지 않은 정점을 만나면, 그 정점에서 도달할 수 있는 모든 정점을 함께 모아 하나의 집합(연결 요소)으로 묶는다.

nn이 최대 1 000 0001\,000\,000까지 커질 수 있어 간선 수가 O(n2)O(n^2)에 이를 수 있으므로, 모든 간선을 만들어 단순한 깊이 우선 탐색을 수행하면 시간 안에 끝나지 않는다. 순열의 구조를 이용하여 연결 요소를 효율적으로 구하라.

입력

첫째 줄에 순열의 길이 nn (1≤n≤1 000 0001 \le n \le 1\,000\,000)이 주어진다.

둘째 줄에 공백으로 구분된 nn개의 정수가 주어지며, 이는 순열의 원소 a1,a2,…,ana_1, a_2, \dots, a_n을 나타낸다.

출력

첫째 줄에 연결 요소의 개수 mm을 출력한다.

이어지는 mm개의 줄에 각 연결 요소를 출력한다. 각 줄에는 먼저 그 요소에 속한 정점의 개수 sis_i를 출력하고, 이어서 그 요소에 속한 sis_i개의 정점 번호를 오름차순으로 공백으로 구분하여 출력한다.

여러 연결 요소를 출력할 때에는, 각 요소에 속한 가장 작은 정점 번호를 기준으로 오름차순으로 정렬하여 출력한다.

힌트

아래 그림은 첫 번째 예제의 순열로 만든 순열 그래프를 나타낸다.

예제3

  1. 예제 1

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

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

    입력
    5
    1 2 3 4 5
    
    예상 출력
    5
    1 1
    1 2
    1 3
    1 4
    1 5