Sắp xếp chèn

Đề bài

Mô tả

Xét thuật toán sắp xếp chèn (insertion sort) dùng để sắp xếp một mảng an phần tử theo thứ tự không giảm:

for (int i = 1; i < n; i = i + 1) {
    int j = i;
    while (j > 0 && a[j] < a[j - 1]) {
        swap(a[j], a[j - 1]);
        j = j - 1;
    }
}

Mảng a là một hoán vị của các số từ 0 đến n1.

Trước khi chạy thuật toán, ta được phép chọn đúng hai vị trí trong mảng và hoán đổi giá trị tại hai vị trí đó. Hãy chọn cặp vị trí sao cho số lần hàm swap được gọi khi chạy thuật toán trên mảng sau khi hoán đổi là nhỏ nhất có thể.

Dữ liệu bảo đảm luôn tồn tại một cách hoán đổi hai phần tử làm giảm số lần gọi swap.

Cần in ra số lần gọi swap nhỏ nhất đạt được, và số cặp vị trí (i,j) mà việc hoán đổi hai phần tử tại chúng đạt được số lần gọi nhỏ nhất đó.

Dữ liệu vào

  • Dòng thứ nhất chứa số nguyên n, độ dài hoán vị.
  • Dòng thứ hai chứa n số nguyên đôi một khác nhau từ 0 đến n1, mô tả hoán vị.

Dữ liệu ra

In ra hai số nguyên: số lần gọi hàm swap nhỏ nhất, và số cặp (i,j) đạt được số lần gọi nhỏ nhất đó.

Ràng buộc

  • 2n5000

Ví dụ

Input Output Giải thích
5
4 0 3 1 2
3 2 Hai cặp vị trí phù hợp là (0,3)(0,4). Sau khi hoán đổi, thuật toán gọi swap đúng 3 lần, ít nhất trong mọi cách chọn.
5
1 2 3 4 0
3 4 Bốn cặp phù hợp là (0,4), (1,4), (2,4)(3,4).

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