canuc80k0624·25/50

Đếm Cặp Có Tổng Trong Khoảng

Nộp bài trên LQDOJ

Bài 06 · Two Pointers

Cho dãy gồm số nguyên dương và hai số với .

Hãy đếm số cặp chỉ số thỏa:

  • ;
  • .

Hai cặp có chỉ số khác nhau được tính là hai cặp khác nhau, kể cả khi các giá trị tại những chỉ số đó bằng nhau.

Input

  • Dòng đầu chứa số nguyên - số bộ dữ liệu.
  • Mỗi bộ dữ liệu gồm:
  • Dòng đầu chứa ba số nguyên .
  • Dòng tiếp theo chứa số nguyên .

Output

  • Với mỗi bộ dữ liệu, in một số nguyên: số cặp thỏa điều kiện. Nếu không có cặp nào, in .

Constraints

  • .
  • trong mỗi bộ dữ liệu.
  • Tổng qua tất cả bộ dữ liệu không vượt .
  • .
  • .
  • Kết quả có thể lớn hơn giới hạn của số nguyên bit.

Scoring

  • Subtask ( số điểm): Tổng không vượt .
  • Subtask ( số điểm): Không có giới hạn bổ sung.

Example

Test 1

Input

3
5 6 10
1 1 5 6 9
4 8 8
4 4 4 4
6 2 20
1 2 3 4 5 6

Output

6
6
15

Giải thích: Ở bộ thứ nhất, sáu cặp hợp lệ có tổng lần lượt là . Ở bộ thứ hai, mọi cặp đều có tổng đúng bằng ; bộ cuối có tất cả 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.