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

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

디스크 조각 모음

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

요약
N개 클러스터에 흩어진 K개 파일을 파일 순서대로 연속 배치하는 최소 클러스터 이동 횟수를 구한다.
난이도

보통10점 중 7점

유형
그래프, 시뮬레이션, 유니온 파인드
정답자
아직 제출이 없습니다

문제

어떤 보안 운영체제는 특별한 파일 시스템을 사용한다. 디스크 전체는 같은 크기의 클러스터 NN개로 나뉘어 있으며, 각 클러스터에는 11번부터 NN번까지 번호가 매겨져 있다. 각 파일은 하나 이상의 클러스터를 차지하며, 그 클러스터들은 디스크 어디에나 흩어져 있을 수 있다. 어떤 파일도 차지하지 않은 클러스터는 비어 있는(자유) 클러스터이다. 어떤 파일의 모든 클러스터가 연속된 클러스터에 자연스러운 순서대로 놓여 있을 때 그 파일을 가장 빠르게 읽을 수 있다.

디스크는 일정한 속도로 회전하므로, 디스크 앞쪽에 있는 클러스터가 뒤쪽에 있는 클러스터보다 빠르게 읽힌다. 그래서 KK개의 파일에는 접근 빈도가 높은 순서대로 11번부터 KK번까지 번호가 매겨진다. ii번 파일이 차지하는 클러스터 수를 SiS_i라 하면, 최적 배치에서 11번 파일은 클러스터 1,2,…,S11, 2, \dots, S_1을, 22번 파일은 클러스터 S1+1,S1+2,…,S1+S2S_1 + 1, S_1 + 2, \dots, S_1 + S_2를, 이런 식으로 차례대로 차지한다.

이 배치를 만들기 위해 클러스터 이동 연산을 수행한다. 클러스터 이동 연산 한 번은, 사용 중인 클러스터 하나의 내용을 메모리로 읽어 들여 비어 있는 클러스터 하나에 기록하는 것이다. 그 뒤 원래 클러스터는 비게 되고, 기록한 클러스터는 사용 중이 된다.

가능한 한 적은 횟수의 클러스터 이동 연산으로 파일들을 최적 배치로 만들어라.

입력

입력은 여러 개의 디스크 설명으로 이루어진다. 각 설명의 첫 줄에는 공백으로 구분된 두 정수 NN과 KK가 주어진다 (1≤K<N≤1000001 \le K < N \le 100000). 이어서 KK개의 줄이 주어지며, 그중 ii번째 줄은 ii번 파일을 설명한다. 이 줄은 ii번 파일의 클러스터 수 SiS_i (1≤Si≤N−K1 \le S_i \le N - K)로 시작하고, 그 뒤에 이 파일이 차지하는 클러스터 번호 SiS_i개가 자연스러운 순서대로 이어진다. 각 클러스터 번호는 11 이상 NN 이하이다.

한 디스크 설명 안의 클러스터 번호는 모두 서로 다르며, 비어 있는 클러스터는 항상 최소한 하나 존재한다. 입력은 NN과 KK 자리에 00 두 개가 주어지는 줄로 끝난다.

출력

각 디스크 설명마다 정확히 한 줄을 출력한다. 이동이 한 번이라도 필요하면 We need M move operations.를 출력하되, 여기서 MM은 최적 배치를 만드는 데 필요한 최소 클러스터 이동 연산 횟수이다. 파일들이 이미 최적으로 배치되어 있다면 대신 No optimization needed.를 출력한다.

예제3

  1. 예제 1

    입력
    20 3
    4 2 3 11 12
    1 7
    3 18 5 10
    30 4
    2 1 2
    3 3 4 5
    2 6 7
    8 8 9 10 11 12 13 14 15
    0 0
    
    예상 출력
    We need 9 move operations.
    No optimization needed.
    
  2. 예제 2

    입력
    3 2
    1 2
    1 1
    0 0
    
    예상 출력
    We need 3 move operations.
    
  3. 예제 3

    입력
    4 1
    2 3 4
    0 0
    
    예상 출력
    We need 2 move operations.