Sắp xếp bằng dịch vòng
Đề bài
Mô tả
Cho một mảng số nguyên được lưu trong một loại bộ nhớ ngoài đặc biệt.
Loại bộ nhớ này không cho phép thay đổi giá trị của một phần tử bất kỳ. Thay vào đó, nó chỉ hỗ trợ phép dịch vòng một đoạn con: bạn cắt ra một đoạn liên tiếp của mảng, dịch vòng (xoay) đoạn đó sang trái một số bước tuỳ ý, rồi đặt trở lại đúng vị trí cũ.
Cụ thể, mỗi phép dịch vòng gồm hai bước:
- Chọn hai chỉ số và với làm hai đầu mút của đoạn.
- Thay đoạn bằng chính nó sau khi dịch vòng sang trái bước, với .
Dịch vòng sang trái bước nghĩa là: dãy trở thành . Ví dụ, là kết quả của việc dịch vòng sang trái bước, còn là kết quả của việc dịch vòng sang trái bước.
Ví dụ, nếu và bạn chọn , , thì đoạn sau khi dịch vòng sang trái bước trở thành , và mảng trở thành .
Hãy sắp xếp mảng theo thứ tự không giảm bằng không quá phép dịch vòng. Bạn không cần tìm số phép dịch nhỏ nhất: mọi cách dùng tối đa phép dịch đều được chấp nhận.
Dữ liệu vào
- Dòng đầu chứa số nguyên () là số bộ dữ liệu.
- dòng tiếp theo mô tả các bộ dữ liệu. Với mỗi bộ:
- Dòng thứ nhất chứa số nguyên () là độ dài mảng.
- Dòng thứ hai chứa số nguyên (). Các phần tử có thể trùng nhau.
Dữ liệu ra
Với mỗi bộ dữ liệu, in ra:
- Dòng đầu chứa số nguyên () là số phép dịch vòng bạn sử dụng.
- dòng tiếp theo, mỗi dòng chứa ba số nguyên , , mô tả một phép dịch vòng, với và .
Nếu mảng đã được sắp xếp sẵn, một đáp án hợp lệ là và không có dòng nào theo sau. Nếu có nhiều đáp án, in ra đáp án bất kỳ.
Ràng buộc
- , ,
Ví dụ
| Input | Output | Giải thích |
|---|---|---|
| 4 2 2 1 3 1 2 1 4 2 4 1 3 5 2 5 1 4 3 |
1 1 2 1 1 2 3 1 2 1 3 2 3 4 1 3 1 3 2 3 5 2 4 5 1 |
Bộ thứ tư: (dịch sang trái ) (dịch sang trái ) (dịch sang trái ). Đây chỉ là một trong nhiều đáp án hợp lệ. |
| 5 2 1 1 2 2 1 2 1 2 2 -1000000000 1000000000 2 1000000000 -1000000000 |
0 1 1 2 1 0 0 1 1 2 1 |
Ba mảng đã sắp xếp sẵn (kể cả mảng có hai phần tử bằng nhau) nên in . Hai mảng còn lại chỉ cần một phép dịch đoạn sang trái bước, tức là đổi chỗ hai phần tử. |
Bình luận