Rank của hoán vị (Ôn tập OLP MT&TN lần 7)

Xem PDF



Tác giả:
Dạng bài
Ngôn ngữ cho phép
Assembly, Awk, C, C#, C++, Clang, Cobol, D, Groovy, Haskell, JS, Java, Kotlin, Lua, Node JS, OCaml, ObjectiveC, Output, PHP, Pascal, Perl, Prolog, Pypy, Pypy 3, Python, Ruby, Rust, Scala, Scratch, Swift
Điểm: 1800 (p) Thời gian: 1.0s Bộ nhớ: 512M Input: bàn phím Output: màn hình

Cô giáo Mẫn đang dẫn dắt đội ngũ phát triển phần mềm cho ứng dụng đọc báo SetNews. Để tăng trải nghiệm cá nhân hóa, ứng dụng có một tính năng sắp xếp giao diện hiển thị các chuyên mục tin tức trên trang chủ. Giả sử SetNews có \(n\) chuyên mục khác nhau được đánh số từ 1 đến \(n\). Cách sắp xếp các chuyên mục này trên màn hình được biểu diễn bởi một hoán vị của tập hợp \((1, 2, \dots, n)\).

Hiện tại, giao diện của người dùng đang hiển thị các chuyên mục theo thứ tự hoán vị \(p_1, p_2, \dots, p_n\). Cô giáo Mẫn yêu cầu team phát triển thêm một nút bấm "Trượt Chuyên Mục" để gợi ý luồng tin mới. Thay vì xáo trộn ngẫu nhiên, khi người dùng bấm nút này, thuật toán sẽ tìm hoán vị có thứ tự từ điển lớn hơn hoán vị hiện tại đúng \(k\) bước. Cụ thể, nếu gọi \(rank(p)\) là thứ tự từ điển của hoán vị \(p\), hệ thống cần tìm hoán vị \(q\) sao cho \(rank(q) - rank(p) = k\). Quy ước hoán vị tăng dần \((1, 2, \dots, n)\) có rank là 1, và hoán vị giảm dần \((n, n-1, \dots, 1)\) có rank là \(n!\).

Bạn hãy giúp team SetNews viết phần lõi thuật toán cho tính năng này nhé!

Input

  • Dòng đầu tiên chứa hai số nguyên dương \(n\)\(k\) mô tả số lượng chuyên mục và số bước trượt.
  • Dòng thứ hai chứa \(n\) số nguyên phân biệt \(p_1, p_2, \dots, p_n\) là một hoán vị của tập \((1, 2, \dots, n)\), thể hiện thứ tự hiển thị hiện tại. Dữ liệu đảm bảo rằng \(rank(p) + k \le n!\).

Output

  • In ra một dòng duy nhất chứa \(n\) số nguyên phân biệt \(q_1, q_2, \dots, q_n\) là hoán vị thể hiện thứ tự hiển thị của các chuyên mục sau khi người dùng bấm nút trượt.

Example

Test 1

Input
4 1
1 2 3 4
Output
1 2 4 3
Note

Hoán vị ban đầu là (1, 2, 3, 4) có thứ tự từ điển là 1. Số bước trượt \(k = 1\). Hoán vị cần tìm phải có thứ tự từ điển là \(1 + 1 = 2\). Hoán vị liền kề lớn hơn tiếp theo chính là (1, 2, 4, 3).

Scoring

  • Subtask 1 (80 points): \(n \le 10^5, k \le 10^5\)
  • Subtask 2 (20 points): \(n \le 10^5, k \le 10^{12}\)

Bình luận

Mới nhất
Tải bình luận...

Không có bình luận nào.