#P17473. [ICPC 2018 Jiaozuo R] Can You Solve the Harder Problem?

    ID: 19940 远端评测题 6000ms 512MiB 尝试: 0 已通过: 0 显示难度省选/NOI− 上传者: 标签>2018线段树后缀自动机 SAM后缀数组 SAICPC单调栈

[ICPC 2018 Jiaozuo R] Can You Solve the Harder Problem?

题目描述

给定一个序列 a\mathbf{a},记作 (a1,a2,⋯ ,an)(a_1, a_2, \cdots, a_n)。对于满足 1≤l≤r≤n1 \leq l \leq r \leq n 的整数 l,rl, r,定义查询

$$\displaystyle Q_{max}(l, r) = \max \lbrace a_l, a_{l + 1}, \cdots, a_r \rbrace .$$

一道简单的问题可能会要求你计算所有满足 1≤l≤r≤n1 \leq l \leq r \leq n 的查询的答案之和,但我们想向你展示一道更难的题目。

定义一个分类器为一个存储不重复元素的容器。分类器中的每个元素拥有两个值,分别称为键值和映射值。每个元素的键值是 a\mathbf{a} 的一个连续子序列,而该元素的映射值则是一个整数,表示该子序列中的最大值。分类器只存储键值互不相同的元素,这意味着重复的额外元素(具有相同键值的元素)将被从分类器中移除。

记 S(l,r)S(l, r) 为 (al,al+1,⋯ ,ar)(a_l, a_{l + 1}, \cdots, a_r),即 a\mathbf{a} 的一个连续子序列,其中 ll 和 rr 为满足 1≤l≤r≤n1 \leq l \leq r \leq n 的整数。现在我们打算用一个分类器 CA\mathbf{CA} 来存储 a\mathbf{a} 的所有连续子序列 S(l,r)S(l, r) 及其对应的 Qmax(l,r)Q_{max}(l, r)。请你求出 CA\mathbf{CA} 中所有映射值之和。

实际上,上文定义的正是一个 C++ 中形如 map<vector<int>, int> 或 Java 中形如 Map<ArrayList<Integer>, Integer> 的映射,因此如果你对这些数据结构运用自如,你可能会意识到我们要做的事情就是将满足 1≤l≤r≤n1 \leq l \leq r \leq n 的所有可能的元素 (S(l,r),Qmax(l,r))(S(l, r), Q_{max}(l, r)) 插入分类器 CA\mathbf{CA} 中,然后要求你计算其中映射值的总和。

输入格式

输入包含多组测试数据,第一行包含一个正整数 TT,表示测试数据组数,最多可达 10001000。

对于每组测试数据,第一行包含一个整数 nn,表示给定序列 a\mathbf{a} 的长度,满足 1≤n≤2×1051 \leq n \leq 2 \times 10^5。

第二行包含 nn 个正整数 a1,a2,⋯ ,ana_1, a_2, \cdots, a_n,描述序列 a\mathbf{a},满足 1≤ai≤1061 \leq a_i \leq 10^6。

我们保证至多有 1010 组测试数据满足 n>1000n > 1000。

输出格式

对于每组测试数据,输出一行包含 CA\mathbf{CA} 中所有映射值之和。

2
3
1 2 3
3
2 3 3
14
14

提示

在第一个样例中,CA\mathbf{CA} 中映射值的总和等于 1+2+3+2+3+31 + 2 + 3 + 2 + 3 + 3。

在第二个样例中,CA\mathbf{CA} 中映射值的总和等于 2+3+3+3+32 + 3 + 3 + 3 + 3。

翻译由 DeepSeek V4 Pro 完成