Universal Cup Judging System

Universal Cup

時間限制: 1 s 記憶體限制: 1024 MB
统计

Średnia średnich nie zawsze jest średnią.

VegiCat właśnie poznał drzewa przedziałowe i chce poćwiczyć korzystanie z nich.

Dla dodatniej liczby całkowitej $n$ rozważa ciąg $a_i = i$ ($1 \le i \le n$). Postanawia zbudować drzewo przedziałowe, aby odpowiadać na zapytania o średnią na przedziale dla tego ciągu.

W drzewie przedziałowym VegiCata każdy wierzchołek odpowiada przedziałowi $[l, r]$ i przechowuje wartość $v_{l,r}$, która w zamierzeniu VegiCata ma reprezentować średnią na tym przedziale. Korzeń odpowiada całemu przedziałowi $[1, n]$.

problem_23592_1a491bf2ea3d5c638f75cb749b35c44a.png

Jednak VegiCat błędnie zakłada, że średnia przedziału ojca zawsze równa się średniej wartości przechowywanych w jego dwóch synach. Dlatego dodaje wartości przechowywane w dwóch synach i dzieli ich sumę przez $2$.

VegiCat najpierw konstruuje drzewo przedziałowe, wywołując $\text{Build}(1, n)$. Po zbudowaniu drzewa przedziałowego odpowiada na zapytanie dla przedziału $[L, R]$, wywołując $\text{Query}(1, n, L, R)$. Obie procedury rekurencyjne przedstawiono w Algorytmie 1.

Algorytm 1 Budowanie i Zapytanie

$$ \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} $$

Chociaż algorytm VegiCata jest w ogólności niepoprawny, dla pewnych przedziałów zwraca poprawną średnią. Policz liczbę takich przedziałów.

Dla przedziału $[L, R]$ jego prawdziwa średnia wynosi

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

Dokładniej, policz liczbę par $(L, R)$ spełniających $1 \le L \le R \le n$, takich że

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

Wszystkie średnie są obliczane jako dokładne liczby wymierne, bez zaokrąglania ani obcinania.

Wejście

Pierwszy wiersz zawiera liczbę całkowitą $T$ ($1 \le T \le 10^4$), oznaczającą liczbę przypadków testowych. Poniżej znajduje się opis przypadków testowych.

Każdy z kolejnych $T$ wierszy zawiera jedną liczbę całkowitą $n$ ($1 \le n \le 10^6$), oznaczającą długość ciągu.

Gwarantuje się, że suma $n$ po wszystkich przypadkach testowych nie przekracza $2 \cdot 10^6$.

Wyjście

Dla każdego przypadku testowego wypisz jedną liczbę całkowitą — liczbę przedziałów $[L, R]$, dla których procedura zapytania VegiCata zwraca dokładnie prawdziwą średnią.

Przykłady

Wejście 1

3
1
5
14

Wyjście 1

1
10
35

Uwaga

Dla drugiego przypadku testowego, $n = 5$, istnieje $10$ poprawnych przedziałów:

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

Na przykład zapytanie o $[2, 5]$ zwraca

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

co równa się prawdziwej średniej z $2, 3, 4, 5$. Zatem przedział $[2, 5]$ jest zliczany.

Z kolei zapytanie o $[1, 5]$ zwraca

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

podczas gdy jego prawdziwa średnia wynosi $3$. Zatem przedział $[1, 5]$ nie jest zliczany.

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.