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