trang chủ / đề bài / shiftsort

Sắp xếp bằng dịch vòng

Đề bài

Mô tả

Cho một mảng số nguyên a[1…n]=[a1,a2,…,an] đượ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:

  1. Chọn hai chỉ số l và r với 1≤l<r≤n làm hai đầu mút của đoạn.
  2. Thay đoạn a[l…r] bằng chính nó sau khi dịch vòng sang trái d bước, với 1≤d≤r−l.

Dịch vòng sang trái d bước nghĩa là: dãy [x1,x2,…,xm] trở thành [xd+1,…,xm,x1,…,xd]. Ví dụ, [1,4,1,3] là kết quả của việc dịch vòng [3,1,4,1] sang trái 1 bước, còn [4,1,3,1] là kết quả của việc dịch vòng [3,1,4,1] sang trái 2 bước.

Ví dụ, nếu a=[1,3,2,8,5] và bạn chọn l=2, r=4, d=2 thì đoạn a[2…4]=[3,2,8] sau khi dịch vòng sang trái 2 bước trở thành [8,3,2], và mảng trở thành a=[1,8,3,2,5].

Hãy sắp xếp mảng a theo thứ tự không giảm bằng không quá n 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 n phép dịch đều được chấp nhận.

Dữ liệu vào

  • Dòng đầu chứa số nguyên t (1≤t≤1000) là số bộ dữ liệu.
  • 2t 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 n (2≤n≤50) là độ dài mảng.
    • Dòng thứ hai chứa n số nguyên a1,a2,…,an (−109≤ai≤109). 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 k (0≤k≤n) là số phép dịch vòng bạn sử dụng.
  • k dòng tiếp theo, mỗi dòng chứa ba số nguyên l, r, d mô tả một phép dịch vòng, với 1≤l<r≤n và 1≤d≤r−l.

Nếu mảng đã được sắp xếp sẵn, một đáp án hợp lệ là k=0 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

  • 1≤t≤1000
  • 2≤n≤50
  • −109≤ai≤109
  • 0≤k≤n, 1≤l<r≤n, 1≤d≤r−l

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ư: [2,5,1,4,3]→[1,2,5,4,3] (dịch a[1..3] sang trái 2) →[1,2,3,5,4] (dịch a[3..5] sang trái 2) →[1,2,3,4,5] (dịch a[4..5] sang trái 1). Đâ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 k=0. Hai mảng còn lại chỉ cần một phép dịch đoạn [1,2] sang trái 1 bước, tức là đổi chỗ hai phần tử.

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.47 awk 1.3.4 gcc 16.2.0 dotnet 10.0.402 g++ 16.2.0 g++-themis 16.2.0 g++17 16.2.0 g++20 16.2.0 g++23 16.2.0 clang++ 22.1.8 dmd 2.113.0 dart 3.13.6 gforth 0.7.3 gfortran 15.3.0 go 1.27.3 groovyc 5.1.3 javac 26.0.2.1 node 26.12.1 julia 1.13.2 kotlinc 2.4.21 lean 4.35.0 sbcl 2.2.9 lua 5.5.1 nim 2.2.12 fpc 3.2.2 fpc-themis 3.2.2 perl 5.42.3 php 8.5.12 pike 8.0 swipl 9.0.4 pypy3 7.3.23 python3 3.15.1 racket 8.7 ruby 4.0.8 rustc 1.99.1 csc 5.3.0 ctoj-scratch 0.0.1 sed 4.9 swiftc 6.4.1 tclsh 8.6 bun 1.4.4 deno 2.9.8 v 0.5.2 zig 0.17.0