我们要找这样的三元组:(x + 1 , x , x + 1) 。对于一个特定的x,我们要算个数,就是去考虑前缀和后缀中x + 1 的个数,快速查询x + 1的个数我们只需要使用使用哈希表即可。假如个数是a和b,答案就是a * b. 所以计算顺序是从左到右枚举中间这个x,这样枚举的好处是左右两边要考虑的区域随着从左到右枚举的过程,它们就是一个连续的前缀和后缀,方便我们更新前缀哈希和后缀哈希。移动过程中前缀哈希增添一个数,后缀哈希删除一个数。
#include<bits/stdc++.h>
给定一个长度为 n 的整数序列 a1,a2,…,an。若存在三个下标 i,j,k 满足 i<j<k,且 ai=ak=aj+1,则称 (i,j,k) 构成一个山谷三元组。请你计算序列中所有山谷三元组的数量。
序列长度 n 在 3 到 10^5 之间,所有元素均为 1 到 10^9 之间的正整数。
第一行包含一个整数 n (3 \le n \le 10^5),表示序列的长度。
第二行包含 n 个整数,每个整数的取值范围为 1 到 10^9。
By signing up a CodeFun2000 universal account, you can submit code and join discussions in all online judging services provided by us.