4. Một số bài toán ví dụ
4.2.5. Dãy nghịch thế
Cho là một số nguyên dương và ( ) là một hoán vị của dãy số ( 2 ). Với , gọi là số phần tử đứng trước giá trị mà lớn hơn trong dãy . Khi đó dãy ( ) được gọi là dãy nghịch thế của dãy ( ).
Ví dụ: Với
Dãy ( 2 ) thì dãy nghịch thế của nó là (2 ) Dãy ( 2 ) thì dãy nghịch thế của nó là ( ) Dãy ( 2 ) thì dãy nghịch thế của nó là ( 2 ) Vấn đề đặt ra là :
Cho trước một dãy hoán vị , hãy tìm dãy nghịch thế của
Cho trước một dãy nghịch thế , hãy tìm dãy hoán vị nhận làm dãy nghịch thế.
Dữ liệu: Vào từ file văn bản IVECTOR.INP gồm 3 dòng:
Dòng 1: Chứa số nguyên dương .
Dòng 2: Chứa dãy hoán vị gồm số
Dòng 3: Chứa dãy nghịch thế : gồm số
Kết quả: Ghi ra file văn bản IVECTOR.OUT gồm 2 dòng:
Dòng 1: Ghi lần lượt từng phần tử của dãy nghịch thế của
Dòng 2: Ghi lần lượt từng phần tử của dãy hoán vị của
Các số trên một dòng của Input/Output files được/phải ghi cách nhau ít nhất một dấu cách IVECTOR.INP IVECTOR.OUT 6 1 2 3 4 5 6 2 1 0 1 1 0 0 0 0 0 0 0 3 2 1 6 4 5
Gợi ý lời giải:
Từ dãy hoán vị tìm dãy nghịch thế :
Khởi tạo lại dãy toàn bằng 0, điền lần lượt các số từ 1 tới trở lại dãy . Mỗi khi điền số vào vị trí , ta đếm số lượng số 0 đứng trước vị trí , số lượng đó
chính là . Việc đếm số lượng số 0 đứng trước vị trí có thể thực hiện bằng cây quản lý phạm vi 1 chiềụ
Từ dãy nghịch thế khôi phục dãy hoán vị :
Khởi tạo dãy toàn bằng 0, xét lần lượt , khi xét tới , thay số 0 thứ trong dãy bởi số . Việc xác định số 0 thứ có thể thực hiện bằng cây quản lý phạm vi 1 chiềụ
Thời gian thực hiện giải thuật ( ). Chương trình: IVECTOR.PAS