Hướng dẫn giải của Giao Nhau Của Những Người Bạn
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.
Lời giải: Giao Nhau Của Những Người Bạn
Hướng tiếp cận
Đây là bài toán đếm nghịch thế (inversion counting) với điều kiện lọc. Thay vì đếm trực tiếp các cặp không thân thiện mà giao nhau, ta dùng:
trong đó:
- Tổng giao nhau: tổng số cặp bò giao nhau (không kể điều kiện thân thiện).
- Giao nhau thân thiện: số cặp thân thiện () mà giao nhau.
Nhận xét quan trọng
Gọi là vị trí của giống bò ở bên trái, là vị trí ở bên phải. Hai giống và giao nhau khi và chỉ khi và trái dấu.
Tổng giao nhau bằng số nghịch thế trong dãy (trong đó là giống bò ở vị trí bên trái). Đây là bài toán đếm nghịch thế cổ điển, giải bằng BIT (Binary Indexed Tree) trong .
Để đếm giao nhau thân thiện, xét các cặp với (tức ) mà và . Ta cần đếm số nghịch thế trong không gian 2D: với điều kiện về giá trị giống bò VÀ về vị trí bên phải.
Thuật toán
Bước 1: Đếm tổng nghịch thế (O(N log N))
Xây dựng dãy với . Đếm số nghịch thế trong bằng BIT: duyệt từ trái sang phải, với mỗi đếm số phần tử đã xét lớn hơn .
Bước 2: Đếm nghịch thế thân thiện (O(N log² N))
Duyệt theo thứ tự bên trái (). Tại bước , giống bò có . Ta cần đếm số thỏa:
- (thân thiện theo giống)
- (giao nhau vì nhưng )
Dùng cây phân đoạn merge-sort (merge sort tree) đánh chỉ số theo giá trị giống bò . Mỗi nút của cây lưu danh sách đã được sắp xếp các giá trị của các giống bò đã được chèn vào phạm vi đó.
- Truy vấn: với giống , đếm các phần tử trong phạm vi giống có . Mỗi truy vấn mất (đi qua nút, mỗi nút tìm nhị phân trong danh sách sắp xếp).
- Chèn: sau khi truy vấn, chèn vào cây.
Lưu ý: Ta truy vấn trước khi chèn, đảm bảo chỉ đếm .
Kết quả
Độ phức tạp
- Thời gian:
- Bước 1:
- Bước 2: — mỗi trong bước có cho truy vấn và cho chèn
- Bộ nhớ: — cây phân đoạn merge-sort lưu tổng phần tử
Bình luận