P1052序列询问(mock1query)

时间限制 2000 ms内存限制 512 MiB通过率 —
显示算法标签树状数组 · 离线算法 · 前缀和

【题目描述】

给定一个长度为 nn 的序列 a1,a2,…,ana_1,a_2,\ldots,a_n,其中对于所有 1≤i≤n1\leq i\leq n,均有 ai∈{0,1}a_i\in\{0,1\}。

对于任意一个只包含 0,10,1 的序列 S=(s1,s2,…,sk)S=(s_1,s_2,\ldots,s_k),从左到右依次扫描其中的元素。初始时栈为空。若栈非空且当前元素与栈顶元素相同,则弹出栈顶,否则将当前元素压入栈中。扫描结束后,将栈中元素从栈底到栈顶依次排列,得到的消除结果记为 red(S)\text{red}(S)。

例如,当 S=(0,1,1,0)S=(0,1,1,0) 时,栈中的元素依次变化为 ∅⟶0⟶01⟶0⟶∅\varnothing\longrightarrow0\longrightarrow01\longrightarrow0\longrightarrow\varnothing,因此 red(S)=∅\text{red}(S)=\varnothing。

有 qq 次询问,其中第 jj 次询问给出两个整数 lj,rjl_j,r_j。对于每个满足 lj≤m<rjl_j\leq m<r_j 的整数 mm,定义左侧序列 Lj,m=(alj,alj+1,…,am)L_{j,m}=(a_{l_j},a_{l_j+1},\ldots,a_m),右侧序列 Rj,m=(am+1,am+2,…,arj)R_{j,m}=(a_{m+1},a_{m+2},\ldots,a_{r_j})。

对于两个序列 A,BA,B,记 A∘BA\circ B 表示将 BB 接在 AA 后得到的序列。先分别求出 red(Lj,m)\text{red}(L_{j,m}) 与 red(Rj,m)\text{red}(R_{j,m}),再将二者拼接,得到 Cj,m=red(Lj,m)∘red(Rj,m)C_{j,m}=\text{red}(L_{j,m})\circ\text{red}(R_{j,m})。

此后继续消除 Cj,mC_{j,m}。这一阶段新消除的元素对数称为分割点 mm 的拼接消除次数,记为

fj(m)=∣Cj,m∣−∣red(Cj,m)∣2.f_j(m)=\frac{|C_{j,m}|-|\text{red}(C_{j,m})|}{2}.

特别地,分别计算 red(Lj,m)\text{red}(L_{j,m}) 与 red(Rj,m)\text{red}(R_{j,m}) 时发生的消除不计入 fj(m)f_j(m)。

对于每次询问,你需要求出所有分割点的拼接消除次数之和,即

∑m=ljrj−1fj(m).\sum_{m=l_j}^{r_j-1}f_j(m).

【输入格式】

从文件 query.in\textbf{\textit{query.in}} 中读入数据。

本题有多组测试数据。

输入的第一行包含两个整数 c,Tc,T,分别表示测试点编号和测试数据的组数。c=0c=0 表示该测试点为样例。

对于每组测试数据:

  • 第一行包含两个正整数 n,qn,q,分别表示序列长度与询问次数。
  • 第二行包含 nn 个整数 a1,a2,…,ana_1,a_2,\ldots,a_n,描述给定的序列。
  • 接下来 qq 行,每行包含两个整数 l,rl,r,表示一次询问的区间。

【输出格式】

输出到文件 query.out\textbf{\textit{query.out}} 中。

对于每次询问,输出一行一个非负整数,表示所有分割点的拼接消除次数之和。

【样例 1 输入】

0 15 30 1 1 0 11 41 52 5

【样例 1 输出】

441

【说明/提示】

【样例 1 解释】

考虑第一次询问 [1,4][1,4]。

当 m=1m=1 时,red(L1,1)=(0)\text{red}(L_{1,1})=(0),red(R1,1)=(0)\text{red}(R_{1,1})=(0),因此 f1(1)=1f_1(1)=1。

当 m=2m=2 时,red(L1,2)=(0,1)\text{red}(L_{1,2})=(0,1),red(R1,2)=(1,0)\text{red}(R_{1,2})=(1,0),因此 f1(2)=2f_1(2)=2。

当 m=3m=3 时,red(L1,3)=(0)\text{red}(L_{1,3})=(0),red(R1,3)=(0)\text{red}(R_{1,3})=(0),因此 f1(3)=1f_1(3)=1。

因此,这次询问的答案为 1+2+1=41+2+1=4。

【样例 2】

见选手目录下的 query/query2.in\textbf{\textit{query/query2.in}} 和 query/query2.ans\textbf{\textit{query/query2.ans}}。

该附加样例满足测试点 1∼31\sim 3 的数据范围。

【样例 3】

见选手目录下的 query/query3.in\textbf{\textit{query/query3.in}} 和 query/query3.ans\textbf{\textit{query/query3.ans}}。

该附加样例满足测试点 7∼97\sim 9 的数据范围。

【样例 4】

见选手目录下的 query/query4.in\textbf{\textit{query/query4.in}} 和 query/query4.ans\textbf{\textit{query/query4.ans}}。

该附加样例满足测试点 10∼1510\sim 15 的数据范围。

【样例 5】

见选手目录下的 query/query5.in\textbf{\textit{query/query5.in}} 和 query/query5.ans\textbf{\textit{query/query5.ans}}。

该附加样例满足测试点 16∼2016\sim 20 的数据范围。

【数据范围】

测试点编号n≤n\leqq≤q\leq
1∼31\sim 330303030
4∼64\sim 62×1032\times 10^32×1032\times 10^3
7∼97\sim 910510^53030
10∼1510\sim 155×1035\times 10^35×1035\times 10^3
16∼2016\sim 2010510^510510^5

对于所有测试数据,保证:

  • 0≤c≤200\leq c\leq20。
  • 1≤T≤101\leq T\leq10。
  • 对于每组测试数据,均有 2≤n≤1052\leq n\leq10^5,1≤q≤1051\leq q\leq10^5。
  • 对于单个测试点内的所有测试数据,保证 ∑n≤105\sum n\leq10^5,∑q≤105\sum q\leq10^5。
  • 对于所有 1≤i≤n1\leq i\leq n,均有 ai∈{0,1}a_i\in\{0,1\}。
  • 对于每次询问,均有 1≤l<r≤n1\leq l<r\leq n。

【题解】

已公开 1 篇题解,官方题解会优先显示。

查看题解