在线测试本题
题目描述
给定 n n n 个数组 a 1 , … , a n a_1, \dots, a_n a1,…,an, 找出所有的严格递增三元组( 1 ≤ i < j < k ≤ n 1 \leq i < j < k \leq n 1≤i<j<k≤n) , 使得 a i = a k = a j + 1 a_i = a_k = a_j + 1 ai=ak=aj+1 , 输出其数量。
输入描述
第一行输入一个正整数 n ( 3 ≤ n ≤ 1 0 5 ) n(3 \leq n \leq 10^5) n(3≤n≤105)
第二行输入 a 1 , . . . , a n ( 1 ≤ a i ≤ 1 0 9 ) a_1,...,a_n(1 \leq a_i \leq 10^9) a1,...,an(1≤ai≤109)
输出描述
一个正整数,代表符合条件的三元组数量
示例
输入
5
2 2 1 1 2
输出
4
题解
我们要找这样的三元组:(x + 1 , x , x + 1) 。对于一个特定的x,我们要算个数,就是去考虑前缀和后缀中x + 1 的个数,快速查询x + 1的个数我们只需要使用使用哈希表即可。假如个数是a和b,答案就是a * b.
所以计算顺序是从左到右枚举中间这个x,这样枚举的好处是左右两边要考虑的区域随着从左到右枚举的过程,它们就是一个连续的前缀和后缀,方便我们更新前缀哈希和后缀哈希。移动过程中前缀哈希增添一个数,后缀哈希删除一个数。
代码见网站内部(文章顶部):塔子哥的文字题解