難易度評価

難易度を1〜10段階で評価できます。投票はあとから変更・取り消しできます。

難易度(投票) 未投票 (0票)

投票の分布

まだ投票はありません。

  1. Lv.10票
  2. Lv.20票
  3. Lv.30票
  4. Lv.40票
  5. Lv.50票
  6. Lv.60票
  7. Lv.70票
  8. Lv.80票
  9. Lv.90票
  10. Lv.100票

難易度の目安を見る ↗

ログインして難易度を投票

外部サイトへ移動します

リンク先の URL を確認してから開いてください。

別タブで開く

Colored Midpoints

作成者 mackerel38

テスター yukimy32

難易度(作成者設定) Lv.7

難易度(投票) 未投票 (0票)

実行時間制限
2 秒
メモリ制限
512 MiB

解説1

値 xx が AA に現れる回数を cxc_x とする。

適当な正整数 BB を定め、各 xx について、cx≤Bc_x \le B と cx>Bc_x \gt B に分けて考える。

  • cx≤Bc_x \le B

    Ai=Aj=xA_i=A_j=x を満たす組 (i,j)(i,j) をすべて列挙し、残りの条件を満たすか判定すれば良い。

    すべての xx について、この処理の計算量は合計で O(NB)O(NB) である。

  • cx>Bc_x \gt B

    多項式

    Fx(z)=∑i:Ai=xziF_x(z)=\sum_{i:A_i=x}z^i

    を考える。

    Fx(z)2F_x(z)^2 の z2mz^{2m} の係数は、Ai=Aj=xA_i=A_j=x かつ i+j=2mi+j=2m を満たす順序付きの組 (i,j)(i,j) の個数である。

    このうち i≠ji\ne j である組はそれぞれ 22 回数えられており、i=ji=j である組は Am=xA_m=x のときに限り 11 回数えられている。

    よって、値 xx に対応する答えは

    ∑m:Sm=1[z2m]Fx(z)2−[zm]Fx(z)2\sum_{m:S_m=\texttt{1}} \frac{[z^{2m}]F_x(z)^2-[z^m]F_x(z)}{2}

    となる。

    Fx(z)2F_x(z)^2 は畳み込みにより O(Nlog⁡N)O(N\log N) 時間で計算できる。

    cx>Bc_x\gt B を満たす xx は高々 N/BN/B 種類なので、この場合の計算量は合計で O(N2log⁡N/B)O(N^2\log N/B) である。

以上より、計算量は O(NB+N2log⁡N/B)O(NB+N^2\log N/B) となる。

B=Θ(Nlog⁡N)B=\Theta(\sqrt{N\log N}) とすることで、O(NNlog⁡N)O(N\sqrt{N\log N}) でこの問題を解くことができる。

解説2

以下、A,SA,S を 00-indexed とする。

i+ji+j が偶数であることは、i,ji,j の偶奇が一致することと同値である。

そこで、AiA_i の値と ii の偶奇が一致するものをグループ化し、それぞれについて条件を満たす組を数える。

同じグループに属する i<ji\lt j を i=2a+pi=2a+p, j=2b+pj=2b+p(p∈{0,1}p\in\{0,1\}、a<ba\lt b)と表すと、

i+j2=a+b+p\frac{i+j}{2}=a+b+p

である。

T[m]=SmT[m]=S_m となる bitset TT を用意する。ただし、0, 1 はそれぞれビットの 00, 11 として扱う。

各グループについて、A2b+p=xA_{2b+p}=x を満たす bb に対して U[b]=1U[b]=1 となる bitset UU を用意する。ここで、xx はそのグループの AiA_i の値である。

aa を昇順に処理し、A2a+p=xA_{2a+p}=x を満たすたびに以下の操作を行う。

  1. U[a]=0U[a]=0 とする。
  2. (U&(T≫(a+p)))(U\mathbin{\&}(T\gg(a+p))) の立っているビットの個数を答えに加算する。

このとき、

U[b]=1  ⟺  a<b∧A2a+p=A2b+pU[b]=1 \iff a\lt b \land A_{2a+p}=A_{2b+p}

(T≫(a+p))[b]=1  ⟺  Sa+b+p=1(T\gg(a+p))[b]=1 \iff S_{a+b+p}=\texttt{1}

であるため、これによって正しい答えを得られる。

以上より、ww をwordsize として O(N2/w)O(N^2/w) でこの問題を解くことができる。

ユーザー解説

ユーザー解説を書く

ユーザー解説はまだありません。