canuc80k0918·19/50

Hiệu Bằng Khoảng Cách

Nộp bài trên LQDOJ

Bài 09 · C++ STL

Cho mảng , với chỉ số bắt đầu từ . Hãy đếm số cặp chỉ số thỏa và .

Input

  • Dòng đầu chứa số bộ test .
  • Mỗi test gồm:
  • Một dòng chứa .
  • Một dòng chứa số nguyên .

Output

  • Với mỗi test, in số cặp chỉ số thỏa mãn.

Constraints

  • .
  • .
  • .
  • Tổng qua mọi test không vượt quá .

Scoring

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

Example

Test 1

Input

3
5
1 2 3 4 5
5
5 4 3 2 1
6
2 3 1 4 6 5

Output

10
0
3

Giải thích: Ở test đầu, tại mọi vị trí nên cả cặp đều hợp lệ. Test hai có các khóa khác nhau. Test cuối, các vị trí cùng có khóa bằng , tạo ba cặp.

Lời giải tóm tắt
  • Phân tích: Ta biến đổi a_j-a_i=j-i thành a_j-j=a_i-i. Vì vậy một cặp hợp lệ đúng khi hai vị trí có cùng khóa a_i-i.
  • Thuật toán: Duyệt i từ 1 tới n. Tính key=a_i-i. Nếu khóa đã xuất hiện cnt[key] lần ở các vị trí trước, phần tử hiện tại tạo đúng bấy nhiêu cặp mới. Cộng vào đáp án rồi tăng bộ đếm khóa.
  • Chứng minh tính đúng đắn: Phép biến đổi đại số tương đương hai chiều. Tại vị trí i, map chứa đúng số vị trí nhỏ hơn i của từng khóa, nên cnt[key_i] đếm chính xác mọi cặp có đầu phải là i. Mỗi cặp được đếm đúng một lần tại đầu phải của nó, vì vậy tổng cuối cùng chính xác.
  • Độ phức tạp: Thời gian kỳ vọng O(n) mỗi test, bộ nhớ O(n).