P1052序列询问mock1query

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

【题目描述】

给定一个长度为 nn 的序列 a1,a2,,ana_1,a_2,\ldots,a_n,其中对于所有 1in1\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) 时,栈中的元素依次变化为 0010\varnothing\longrightarrow0\longrightarrow01\longrightarrow0\longrightarrow\varnothing,因此 red(S)=\text{red}(S)=\varnothing

qq 次询问,其中第 jj 次询问给出两个整数 lj,rjl_j,r_j。对于每个满足 ljm<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,记 ABA\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,mred(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=ljrj1fj(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}}

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

【样例 3】

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

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

【样例 4】

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

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

【样例 5】

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

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

【数据范围】

测试点编号nn\leqqq\leq
131\sim 330303030
464\sim 62×1032\times 10^32×1032\times 10^3
797\sim 910510^53030
101510\sim 155×1035\times 10^35×1035\times 10^3
162016\sim 2010510^510510^5

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

  • 0c200\leq c\leq20
  • 1T101\leq T\leq10
  • 对于每组测试数据,均有 2n1052\leq n\leq10^51q1051\leq q\leq10^5
  • 对于单个测试点内的所有测试数据,保证 n105\sum n\leq10^5q105\sum q\leq10^5
  • 对于所有 1in1\leq i\leq n,均有 ai{0,1}a_i\in\{0,1\}
  • 对于每次询问,均有 1l<rn1\leq l<r\leq n

【题解】

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

查看题解