这显然可以\(\Theta(n^3)\)枚举统计.
也显然可以
\(\Theta(n)\)处理前缀和然后
\(\Theta(n^2)\)枚举统计.
然后我们发现,前缀和之后,我们就把问题转化成了这样:
给定一个三元组序列,求有多少对\((i,j)\)满足对应位置的三元组每个位置的差都相等.
即
\((j_1-i_1=j_2-i_2=j_3-i_3).\) 然后我们发现,这个东西其实不需要这样.
我们考虑能对答案造成一个贡献的情况是怎样的,设左端点为
\(l\),右端点为
\(r\).
则充要条件为
\[s_{r,0}-s_{l-1,0}=s_{r,1}-s_{l-1,1}=s_{r,2}-s_{l-1,2}\] 我们两两考虑:
则条件变为:
\[s_{r,0}-s_{l-1,0}=s_{r,1}-s_{l-1,1}\] 且
\[s_{r,1}-s_{l-1,1}=s_{r,2}-s_{l-1,2}\] 分别移项,得:
\[s_{r,0}-s_{r,1}=s_{l-1,0}-s_{l-1,1}\] 且
\[s_{r,1}-s_{r,2}=s_{l-1,1}-s_{l-1,2}\] 这样我们就将每一项都变得只与自己有关.
所以我们就可以把每一项变成一个二元组:
\((s_{i,0}-s_{i,1},s_{i,1}-s_{i,2})\) 然后就只需要统计有多少对相同的二元组即可,要注意空集.
\(Code:\) #include #include #include #include #include #include #include #include #include #include #include