P4029 [CodeChef] COUNTARI
问题描述
给定一个长度为N的数组A[],求有多少对$i, j, k(1\leq i<j<k\leq N)$满足$A[k]-A[j]=A[j]-A[i]$
输入格式
第一行一个整数$N(N<=10^5)$。
接下来一行N个数$A[i](A[i]<=30000)$。
输出格式
一行一个整数。
样例输入
10
3 5 3 6 3 4 10 4 5 2
样例输出
9
容易想到一个朴素的暴力,枚举$j$的位置,然后两边卷积得到$A[i]+A[k]=2A[j]$的$(i,k)$的数量。考虑优化。
用分块处理,设块的大小为$K$,那么分三种情况来讨论。
当$i,j,k$在同一块内时,枚举$(i,k)$,同时维护$cnt[j]$,那么单块可以在$O(K^2)$内出解,总复杂度就是$O(NK)$的
当$i,j,k$有两个在同一块内时,同样枚举$(i,k)$,复杂度仍然是$O(NK)$
当$i,j,k$均不在同一块时,枚举每一块,将左右两边的块卷积起来,复杂度就是$\frac{N}{K}M\log M$,$M=max{A[i]}$
那么只需要一个比较优秀的$K$即可解决。似乎当$K=5.3\sqrt{N}$时效果不错。
代码:
1 |
|