Giải thích: Ở bộ thứ nhất, sáu cặp hợp lệ có tổng lần lượt là 6,6,7,7,10,10. Ở bộ thứ hai, mọi cặp đều có tổng đúng bằng 8; bộ cuối có tất cả 15 cặp nằm trong khoảng yêu cầu.
Lời giải tóm tắt
Phân tích: Gọi F(X) là số cặp có tổng không vượt X. Khi đó số cặp có tổng thuộc đoạn đóng [L,R] bằng F(R)-F(L-1).
Phân tích: Sau khi sắp xếp, dùng hai con trỏ để tính F(X). Nếu a_l+a_r≤X, thì với cùng l, mọi chỉ số từ l+1 đến r đều tạo cặp hợp lệ; cộng r-l rồi tăng l. Nếu tổng lớn hơn X, giảm r.
Chứng minh đúng: Khi a_l+a_r≤X, do dãy đã sắp xếp nên a_l+a_j≤X với mọi l<j≤r; thuật toán đếm đúng toàn bộ r-l cặp có đầu trái l, rồi không xét lại đầu trái đó. Khi a_l+a_r>X, phần tử a_r cũng tạo tổng vượt X với mọi đầu trái còn lại từ l trở lên, nên chưa có cặp hợp lệ nào chứa r trong phần chưa xử lý và ta có thể giảm r. Hai con trỏ vì vậy đếm đúng mọi cặp có tổng không vượt X đúng một lần. Lấy hiệu F(R)-F(L-1) giữ lại chính xác các cặp có tổng trong [L,R].
Độ phức tạp: Mỗi bộ dữ liệu cần O(n log n) thời gian để sắp xếp, O(n) để quét và O(n) bộ nhớ; đáp án dùng 64 bit.