Universal Cup Judging System

Universal Cup

Límite de tiempo: 1 s Límite de memoria: 1024 MB
Estadísticas

Trung bình của các trung bình không phải lúc nào cũng là trung bình.

VegiCat vừa mới học về cây phân đoạn (segment tree) và muốn luyện tập sử dụng chúng.

Với một số nguyên dương $n$, cậu xét dãy số $a_i = i$ ($1 \le i \le n$). Cậu quyết định xây dựng một cây phân đoạn để trả lời các truy vấn trung bình đoạn trên dãy số này.

Trong cây phân đoạn của VegiCat, mỗi nút tương ứng với một đoạn $[l, r]$ và lưu một giá trị $v_{l,r}$, mà VegiCat dự định dùng để biểu diễn giá trị trung bình trên đoạn đó. Nút gốc tương ứng với toàn bộ đoạn $[1, n]$.

problem_23592_1a491bf2ea3d5c638f75cb749b35c44a.png

Tuy nhiên, VegiCat lại nhầm tưởng rằng giá trị trung bình của một đoạn cha luôn bằng trung bình cộng của hai giá trị lưu ở hai nút con của nó. Do đó, cậu cộng các giá trị lưu ở hai nút con lại rồi chia tổng đó cho $2$.

Đầu tiên VegiCat xây dựng cây phân đoạn bằng cách gọi $\text{Build}(1, n)$. Sau khi cây phân đoạn đã được xây dựng, cậu trả lời một truy vấn cho đoạn $[L, R]$ bằng cách gọi $\text{Query}(1, n, L, R)$. Hai thủ tục đệ quy này được cho trong Thuật toán 1.

Thuật toán 1 Xây dựng và Truy vấn

$$ \begin{array}{rl} 1: & \textbf{procedure } \text{Build}(l, r) \\ 2: & \quad \textbf{if } l = r \textbf{ then} \\ 3: & \quad \quad v_{l,l} \leftarrow a_l \\ 4: & \quad \quad \textbf{return} \\ 5: & \quad \textbf{end if} \\ 6: & \quad m \leftarrow \left\lfloor \dfrac{l + r}{2} \right\rfloor \\ 7: & \quad \text{Build}(l, m) \\ 8: & \quad \text{Build}(m + 1, r) \\ 9: & \quad v_{l,r} \leftarrow \dfrac{v_{l,m} + v_{m+1,r}}{2} \\ 10: & \textbf{end procedure} \\[6pt] 11: & \textbf{procedure } \text{Query}(l, r, L, R) \\ 12: & \quad \textbf{if } L \le l \textbf{ and } r \le R \textbf{ then} \\ 13: & \quad \quad \textbf{return } v_{l,r} \\ 14: & \quad \textbf{end if} \\ 15: & \quad m \leftarrow \left\lfloor \dfrac{l + r}{2} \right\rfloor \\ 16: & \quad \textbf{if } R \le m \textbf{ then} \\ 17: & \quad \quad \textbf{return } \text{Query}(l, m, L, R) \\ 18: & \quad \textbf{else if } L > m \textbf{ then} \\ 19: & \quad \quad \textbf{return } \text{Query}(m + 1, r, L, R) \\ 20: & \quad \textbf{end if} \\ 21: & \quad x \leftarrow \text{Query}(l, m, L, R) \\ 22: & \quad y \leftarrow \text{Query}(m + 1, r, L, R) \\ 23: & \quad \textbf{return } \dfrac{x + y}{2} \\ 24: & \textbf{end procedure} \end{array} $$

Mặc dù thuật toán của VegiCat nhìn chung là không chính xác, nhưng nó vẫn trả về giá trị trung bình đúng cho một số đoạn. Hãy đếm số lượng các đoạn như vậy.

Đối với một đoạn $[L, R]$, giá trị trung bình thực sự của nó là

$$ \frac{\sum_{i=L}^{R} a_i}{R - L + 1}. $$

Chính xác hơn, hãy đếm số cặp $(L, R)$ thỏa mãn $1 \le L \le R \le n$ sao cho

$$ \text{Query}(1, n, L, R) = \frac{\sum_{i=L}^{R} a_i}{R - L + 1}. $$

Tất cả các giá trị trung bình đều được tính dưới dạng số hữu tỉ chính xác, không làm tròn hay cắt bỏ phần thập phân.

Dữ liệu vào

Dòng đầu tiên chứa một số nguyên $T$ ($1 \le T \le 10^4$), là số lượng bộ dữ liệu. Mô tả của các bộ dữ liệu theo sau.

Mỗi dòng trong $T$ dòng tiếp theo chứa một số nguyên $n$ ($1 \le n \le 10^6$), là độ dài của dãy số.

Dữ liệu đảm bảo tổng của $n$ trong tất cả các bộ dữ liệu không vượt quá $2 \cdot 10^6$.

Dữ liệu ra

Với mỗi bộ dữ liệu, in ra một số nguyên — số lượng đoạn $[L, R]$ mà thủ tục truy vấn của VegiCat trả về chính xác giá trị trung bình thực sự.

Ví dụ

Dữ liệu vào 1

3
1
5
14

Dữ liệu ra 1

1
10
35

Ghi chú

Ở bộ dữ liệu thứ hai, $n = 5$, có $10$ đoạn hợp lệ:

$$ \begin{aligned} &[1, 1],\ [1, 2],\ [2, 2],\ [2, 3],\ [2, 5], \\ &[3, 3],\ [3, 4],\ [4, 4],\ [4, 5],\ [5, 5]. \end{aligned} $$

Ví dụ, truy vấn $[2, 5]$ trả về

$$ \frac{\frac{2+3}{2} + \frac{4+5}{2}}{2} = \frac{7}{2}, $$

bằng với giá trị trung bình thực sự của $2, 3, 4, 5$. Do đó, $[2, 5]$ được tính.

Ngược lại, truy vấn $[1, 5]$ trả về

$$ \frac{\frac{\frac{1+2}{2}+3}{2} + \frac{4+5}{2}}{2} = \frac{27}{8}, $$

trong khi giá trị trung bình thực sự của nó là $3$. Do đó, $[1, 5]$ không được tính.

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.