Chống Phân Mảnh Ổ Đĩa

Đề bài

Mô tả

Một ổ đĩa gồm n cụm (cluster) được đánh số từ 1 đến n. Trên đĩa có m tệp được ghi. Tệp thứ i chiếm ni cụm với số hiệu ai,1,ai,2,,ai,ni. Các cụm này không nhất thiết nằm liên tiếp, nhưng thứ tự được cho tương ứng với thứ tự các mảnh của tệp (cụm ai,1 chứa mảnh đầu tiên của tệp i, cụm ai,2 chứa mảnh thứ hai, v.v.). Đảm bảo có ít nhất một cụm trống (không thuộc tệp nào).

Bạn được phép thực hiện thao tác sao chép nội dung của cụm i sang cụm j (với ij). Nếu cụm j trước đó đang chứa dữ liệu thì dữ liệu đó bị mất vĩnh viễn. Các cụm không bị xóa, nhưng sau khi chống phân mảnh xong thì một số cụm chỉ đơn giản được tuyên bố là không dùng nữa (dù chúng có thể vẫn còn chứa mảnh dữ liệu cũ).

Hãy dùng một dãy thao tác sao chép để mỗi tệp chiếm một vùng nhớ liên tiếp. Các tệp phải nối tiếp nhau từ đầu ổ đĩa, và mọi cụm trống (không dùng) phải nằm ở cuối ổ đĩa. Sau khi chống phân mảnh, thứ tự giữa các tệp là tùy ý, nhưng các mảnh của mỗi tệp phải nằm liên tiếp theo đúng thứ tự từ mảnh đầu đến mảnh cuối.

In ra dãy thao tác dẫn tới việc chống phân mảnh. Không cần tối thiểu hóa số thao tác, nhưng số thao tác không được vượt quá 2n.

Dữ liệu vào

  • Dòng đầu chứa hai số nguyên nm — số cụm và số tệp.
  • m dòng tiếp theo mô tả các tệp. Số đầu tiên trên mỗi dòng là ni (số cụm tệp i chiếm), tiếp theo là ni số ai,1,ai,2,,ai,ni.

Đảm bảo mỗi số hiệu cụm xuất hiện không quá một lần và tồn tại ít nhất một cụm trống.

Dữ liệu ra

  • Dòng đầu in một số nguyên k — số thao tác cần thực hiện.
  • k dòng tiếp theo, mỗi dòng chứa một thao tác dạng "i j" (sao chép nội dung cụm i sang cụm j).

Nếu có nhiều cách, in ra cách bất kỳ thỏa mãn 0k2n.

Ràng buộc

  • 1n,m200
  • ni11ai,jn
  • Mỗi số hiệu cụm xuất hiện không quá một lần; tồn tại ít nhất một cụm trống.

Ví dụ

Input Output Giải thích
7 2
2 1 3
3 2 4 5
3
2 6
3 2
6 3
Tệp 1 chiếm cụm 1, 3; tệp 2 chiếm cụm 2, 4, 5. Cần đưa về dạng các cụm 1..5 chứa lần lượt mảnh tệp 1, mảnh tệp 2 liên tiếp. Sao chép 2→6 để cất dữ liệu cụm 2, rồi 3→2 đưa mảnh thứ hai tệp 1 về cụm 2, cuối cùng 6→3 đưa mảnh đầu tệp 2 về cụm 3. Cụm 6, 7 còn trống ở cuối.
7 2
2 1 2
3 3 4 5
0 Tệp 1 đã ở cụm 1, 2 và tệp 2 ở cụm 3, 4, 5 — đã liên tiếp từ đầu ổ đĩa, các cụm trống 6, 7 ở cuối nên không cần thao tác nào.

Bình luận

Không có bình luận tại thời điểm này.

gnatmake 12.2.0 a68g 3.1.2 nasm 2.16.1 as_x64 2.46 awk 1.3.4 gcc 16.1.0 csc 6.12.0.200 g++ 16.1.0 g++-themis 16.1.0 g++17 16.1.0 g++20 16.1.0 g++23 16.1.0 clang++ 22.1.6 dmd 2.112.0 dart 3.12.1 gforth 0.7.3 gfortran 12.2.0 go 1.26.3 groovyc 5.0.6 javac 25.0.3 node 26.2.0 kotlinc 2.3.21 sbcl 2.2.9 lua 5.4.8 nim 2.2.10 fpc 3.2.2 fpc-themis 3.2.2 perl 5.36.0 php 8.5.6 pike 8.0 pypy3 7.3.23 python3 3.14.5 racket 8.7 ruby 4.0.5 rustc 1.96.0 csc 5.3.0 ctoj-scratch 0.0.1 sed 4.9 tclsh 8.6 bun 1.3.14 deno 2.8.1 v 0.5.1 zig 0.16.0