解説1
値 x が A に現れる回数を cx とする。
適当な正整数 B を定め、各 x について、cx≤B と cx>B に分けて考える。
-
cx≤B
Ai=Aj=x を満たす組 (i,j) をすべて列挙し、残りの条件を満たすか判定すれば良い。
すべての x について、この処理の計算量は合計で O(NB) である。
-
cx>B
多項式
Fx(z)=i:Ai=x∑zi
を考える。
Fx(z)2 の z2m の係数は、Ai=Aj=x かつ i+j=2m を満たす順序付きの組 (i,j) の個数である。
このうち i=j である組はそれぞれ 2 回数えられており、i=j である組は Am=x のときに限り 1 回数えられている。
よって、値 x に対応する答えは
m:Sm=1∑2[z2m]Fx(z)2−[zm]Fx(z)
となる。
Fx(z)2 は畳み込みにより O(NlogN) 時間で計算できる。
cx>B を満たす x は高々 N/B 種類なので、この場合の計算量は合計で O(N2logN/B) である。
以上より、計算量は O(NB+N2logN/B) となる。
B=Θ(NlogN) とすることで、O(NNlogN) でこの問題を解くことができる。
解説2
以下、A,S を 0-indexed とする。
i+j が偶数であることは、i,j の偶奇が一致することと同値である。
そこで、Ai の値と i の偶奇が一致するものをグループ化し、それぞれについて条件を満たす組を数える。
同じグループに属する i<j を i=2a+p, j=2b+p(p∈{0,1}、a<b)と表すと、
2i+j=a+b+p
である。
T[m]=Sm となる bitset T を用意する。ただし、0, 1 はそれぞれビットの 0, 1 として扱う。
各グループについて、A2b+p=x を満たす b に対して U[b]=1 となる bitset U を用意する。ここで、x はそのグループの Ai の値である。
a を昇順に処理し、A2a+p=x を満たすたびに以下の操作を行う。
- U[a]=0 とする。
- (U&(T≫(a+p))) の立っているビットの個数を答えに加算する。
このとき、
U[b]=1⟺a<b∧A2a+p=A2b+p
(T≫(a+p))[b]=1⟺Sa+b+p=1
であるため、これによって正しい答えを得られる。
以上より、w をwordsize として O(N2/w) でこの問題を解くことができる。