CF1223F Stack Exterminable Arrays
题目描述
让我们来看如下过程:最开始你有一个空栈和一个长度为 $l$ 的数组 $s$。你尝试按顺序将数组元素 $s_1, s_2, s_3, \dots, s_{l}$ 压入栈中。此外,如果栈为空,或者当前栈顶元素不等于当前元素,则你直接将当前元素压入栈顶。否则,你不仅不将当前元素压入栈,还要弹出栈顶元素。
如果这个过程结束后栈为空,则称数组 $s$ 是“可栈消灭”的。
以下是一些“可栈消灭”的数组示例:
- $[1, 1]$;
- $[2, 1, 1, 2]$;
- $[1, 1, 2, 2]$;
- $[1, 3, 3, 1, 2, 2]$;
- $[3, 1, 3, 3, 1, 3]$;
- $[3, 3, 3, 3, 3, 3]$;
- $[5, 1, 2, 2, 1, 4, 4, 5]$;
以 $s = [5, 1, 2, 2, 1, 4, 4, 5]$ 为例,详细说明栈的变化过程(栈顶用加粗表示):
1. 压入 $s_1 = 5$ 后,栈变为 $[\textbf{5}]$;
2. 压入 $s_2 = 1$ 后,栈变为 $[5, \textbf{1}]$;
3. 压入 $s_3 = 2$ 后,栈变为 $[5, 1, \textbf{2}]$;
4. 压入 $s_4 = 2$ 后,栈变为 $[5, \textbf{1}]$;
5. 压入 $s_5 = 1$ 后,栈变为 $[\textbf{5}]$;
6. 压入 $s_6 = 4$ 后,栈变为 $[5, \textbf{4}]$;
7. 压入 $s_7 = 4$ 后,栈变为 $[\textbf{5}]$;
8. 压入 $s_8 = 5$ 后,栈为空。
现在,给定一个数组 $a_1, a_2, \ldots, a_n$,你需要计算它有多少个子数组是“可栈消灭”的。
注意,你需要回答 $q$ 个独立的询问。
输入格式
第一行包含一个整数 $q$($1 \leq q \leq 3 \cdot 10^5$),表示询问的数量。
每个询问的第一行包含一个整数 $n$($1 \leq n \leq 3 \cdot 10^5$),表示数组 $a$ 的长度。
每个询问的第二行包含 $n$ 个整数 $a_1, a_2, \ldots, a_n$($1 \leq a_i \leq n$),表示数组的元素。
保证所有询问中 $n$ 的总和不超过 $3 \cdot 10^5$。
输出格式
对于每个测试用例,输出一个整数,表示数组 $a$ 的“可栈消灭”子数组的数量,每行一个答案。
说明/提示
对于第一个询问,有四个“可栈消灭”子数组:$a_{1 \ldots 4} = [2, 1, 1, 2]$,$a_{2 \ldots 3} = [1, 1]$,$a_{2 \ldots 5} = [1, 1, 2, 2]$,$a_{4 \ldots 5} = [2, 2]$。
对于第二个询问,只有一个“可栈消灭”子数组,即 $a_{3 \ldots 4}$。
对于第三个询问,有八个“可栈消灭”子数组:$a_{1 \ldots 8}, a_{2 \ldots 5}, a_{2 \ldots 7}, a_{2 \ldots 9}, a_{3 \ldots 4}, a_{6 \ldots 7}, a_{6 \ldots 9}, a_{8 \ldots 9}$。
由 ChatGPT 4.1 翻译