Editorial for Dãy hoán vị
Submitting an official solution before solving the problem yourself is a bannable offence.
Author:
Subtask 1: Xây dựng dãy số với với mọi . Khi đó, dãy cũng là một dãy hoán vị và ta có thể hoán đổi giá trị của và nếu và , hay nói cách khác, ta có thể hoán đổi hai phần tử liền kề và nếu . Ta có nhận xét sau:
Nhận xét 1: Cho dãy hoán vị độ dài . Với mọi cặp số thỏa mãn , gọi và là hai chỉ số thỏa mãn và , gọi và là hai chỉ số thỏa mãn và . Khi đó, điều kiện cần và đủ để dãy có thể biến đổi thành dãy là và hoặc và .
Từ đó, ta có thể kiểm tra tất cả các hoán vị độ dài tổng cộng dãy hoán vị, với mỗi hoán vị , kiểm tra xem dãy có thể biến đổi thành dãy hay không từ nhận xét trên việc kiểm tra có thể thực hiện trong , nếu có thể biến đổi, xây dựng dãy với . Đáp án là dãy số có thứ tự từ điển nhỏ nhất trong số các dãy tìm được.
Độ phức tạp
Subtask 2: Từ việc xây dựng dãy với với mọi , ta có nhận xét mở rộng từ nhận xét như sau:
Nhận xét 2: Cho dãy hoán vị độ dài . Với mọi cặp số thỏa mãn , khi đó, điều kiện cần và đủ để dãy có thể biến đổi thành dãy là và hoặc và .
Từ nhận xét trên, ta có thể xem bài toán ban đầu trở thành một bài toán đồ thị như sau:
Bài toán: Cho dãy hoán vị độ dài . Xây dựng một đồ thị gồm đỉnh bằng cách: thêm cạnh nối một chiều từ đỉnh đến đỉnh nếu và . Tìm một mảng có thứ tự từ điển nhỏ nhất thỏa mãn: với mọi cạnh từ đến thì . Bài toán sắp xếp Topo
Từ việc phát biểu bài toán như trên, đỉnh có bậc vào bằng là đỉnh thỏa mãn: đạt giá trị nhỏ nhất trong khoảng , từ đó có thể tìm kiếm đỉnh trong . Việc xây dựng mảng có thể thực hiện như sau:
- Bước 1: Gọi là giá trị để gán cho mảng , ban đầu .
- Bước 2: Tìm đỉnh nhỏ nhất là đỉnh có bậc vào bằng và gán .
- Bước 3: Xóa đỉnh và các cạnh nối từ khỏi đồ thị.
- Bước 4: Tăng giá trị và quay lại bước 2.
Độ phức tạp:
Subtask 3: Việc tìm kiếm đỉnh có bậc vào bằng và xóa đỉnh khỏi đồ thị có thể thực hiện với cấu trúc Segment Tree với các thao tác cập nhật điểm và truy vấn đoạn. Bài toán có thể giải quyết với độ phức tạp .
Comments