Universal Cup Judging System

Universal Cup

시간 제한: 1 s 메모리 제한: 1024 MB
통계

Medelvärdet av medelvärden är inte alltid medelvärdet.

VegiCat har precis lärt sig om segmentträd och vill öva på att använda dem.

För ett positivt heltal $n$ betraktar han talföljden $a_i = i$ ($1 \le i \le n$). Han bestämmer sig för att bygga ett segmentträd för att besvara frågor om intervallmedelvärde på denna talföljd.

I VegiCats segmentträd motsvarar varje nod ett intervall $[l, r]$ och lagrar ett värde $v_{l,r}$, som VegiCat avser ska representera medelvärdet över det intervallet. Roten motsvarar hela intervallet $[1, n]$.

problem_23592_1a491bf2ea3d5c638f75cb749b35c44a.png

VegiCat antar dock felaktigt att ett föräldraintervalls medelvärde alltid är lika med medelvärdet av de värden som lagras i dess två barnnoder. Därför adderar han värdena som lagras i de två barnnoderna och dividerar summan med $2$.

VegiCat konstruerar först segmentträdet genom att anropa $\text{Build}(1, n)$. Efter att segmentträdet har byggts besvarar han en fråga för ett intervall $[L, R]$ genom att anropa $\text{Query}(1, n, L, R)$. De två rekursiva procedurerna ges i Algoritm 1.

Algoritm 1 Bygg och Fråga

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

Även om VegiCats algoritm är felaktig i allmänhet returnerar den rätt medelvärde för vissa intervall. Räkna antalet sådana intervall.

För ett intervall $[L, R]$ är dess sanna medelvärde

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

Mer precist, räkna antalet par $(L, R)$ som uppfyller $1 \le L \le R \le n$ sådana att

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

Alla medelvärden beräknas som exakta rationella tal, utan avrundning eller trunkering.

Indata

Den första raden innehåller ett heltal $T$ ($1 \le T \le 10^4$), antalet testfall. Beskrivningen av testfallen följer.

Var och en av de följande $T$ raderna innehåller ett heltal $n$ ($1 \le n \le 10^6$), talföljdens längd.

Det garanteras att summan av $n$ över alla testfall inte överstiger $2 \cdot 10^6$.

Utdata

För varje testfall, skriv ut ett heltal — antalet intervall $[L, R]$ för vilka VegiCats frågeprocedur returnerar exakt det sanna medelvärdet.

Exempel

Indata 1

3
1
5
14

Utdata 1

1
10
35

Kommentar

För det andra testfallet, $n = 5$, finns det $10$ giltiga intervall:

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

Till exempel returnerar en fråga på $[2, 5]$

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

vilket är lika med det sanna medelvärdet av $2, 3, 4, 5$. Alltså räknas $[2, 5]$.

Å andra sidan returnerar en fråga på $[1, 5]$

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

medan dess sanna medelvärde är $3$. Alltså räknas inte $[1, 5]$.

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.