canuc80k2505·6/50

Xác Suất Cùng Màu

Nộp bài trên LQDOJ

Bài 25 · Mo's Algorithm

Cho một dãy gồm màu. Mỗi truy vấn chọn một đoạn đóng . Từ tất cả các cặp không có thứ tự gồm hai vị trí khác nhau trong đoạn, ta chọn đều ngẫu nhiên một cặp. Hãy tính xác suất hai vị trí được chọn có cùng màu.

Kết quả phải được viết dưới dạng phân số tối giản . Nếu đoạn có ít hơn hai vị trí hoặc không có cặp cùng màu, quy ước kết quả là .

Input

  • Dòng đầu chứa hai số nguyên và - số phần tử của dãy và số truy vấn.
  • Dòng thứ hai chứa số nguyên - màu tại từng vị trí.
  • Mỗi trong dòng tiếp theo chứa hai số nguyên và .

Output

  • Với mỗi truy vấn, in trên một dòng phân số tối giản biểu diễn xác suất cần tìm.

Constraints

  • .
  • với mọi .
  • với mọi truy vấn.

Scoring

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

Example

Test 1

Input

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

Output

4/15
1/3
0/1
0/1

Giải thích: Trong có cặp cùng màu trên tổng cặp. Đoạn có hai cặp cùng màu trên sáu cặp, còn hai truy vấn cuối không tạo được cặp cùng màu nên đều cho .

Lời giải tóm tắt
  • Ý tưởng: Sắp truy vấn theo thứ tự Mo; duy trì tổng Σ C(cnt[x],2), rồi rút gọn với mẫu C(len,2) bằng ước chung lớn nhất. Cửa sổ hiện hành luôn là một đoạn đóng; mỗi lần dịch một đầu mút chỉ thêm hoặc xóa đúng một phần tử.
  • Tính đúng đắn: Sau bốn vòng dịch biên của một truy vấn, cửa sổ hiện hành đúng bằng đoạn cần hỏi. Nếu một màu đang xuất hiện f lần, thêm một vị trí cùng màu tạo đúng f cặp mới; thao tác xóa là phép đảo tương ứng. Vì vậy biến same luôn bằng tổng C(cnt[x],2). Chia same cho C(len,2) và rút gọn cho đúng xác suất. Vì trạng thái ban đầu đúng cho cửa sổ rỗng và từng phép cập nhật đều bảo toàn bất biến, đáp án ghi cho mọi truy vấn là chính xác.
  • Độ phức tạp: Với block size thích hợp, số lần thêm/xóa theo mô hình Mo cổ điển là O((n+q)√n) cho một bộ dữ liệu; mỗi cập nhật tốn O(1) trung bình. Bộ nhớ là O(n+q).
  • Lỗi thường gặp: Dùng số cặp có thứ tự len(len-1) làm mẫu số thay vì C(len,2).
  • Lỗi thường gặp: Không đảo đúng thao tác khi một phần tử rời cửa sổ.
  • Lỗi thường gặp: Bỏ sót phần tử ở đầu phải vì nhầm đoạn đóng [l,r] với đoạn nửa mở.