ABC256F
ABC256F の解説
解答コード
https://atcoder.jp/contests/abc256/submissions/32580103 (1534 ms)
問題
タイトル通り,数列Aの累積和Bの累積和Cの累積和Dを求める問題です.
解説
概要図です.
概要図の内容は,公式解説(by kyopro_friends)を図解したものになります.
Dx = ... の式の導出は,公式解説を参照してください m(_ _)m.
この問題のポイントです.
Aの点更新は,Bの区間更新になり,
Bの点更新は,Cの区間更新になり,
Cの点更新は,Dの区間更新を意味するので,
愚直な実装では到底間に合いません.
そのため,A→B→C→Dが愚直に計算できないので,A→Dを直接計算できるような,第三の配列E, F, Gを用意することを考えます.
ただし,E, F, Gの第x項をクエリの度に累積和をとって,計算量O(N)で算出するようでは間に合わないので,区間和をO(logN)で算出できるBITを用います.
これは,Aの点更新にもO(logN)で計算できるので間に合います.
点更新をする際は,「a を v に置き換える」計算は,「a にv-a を足す」こと再現しています.
コードを提出リンクより参照できますが,あらゆるケースでBITをテストしているわけではなく,動作に確証がないので,もっと整備されたコードを各自参考にしてください.
m(_ _)m.
Parameters:
------------
bit0 : BITのクラス
概要図の配列Exを計算するためのBIT.x=xのときのExの値は,変数e0.
bit1 : BITのクラス
概要図の配列Fxを計算するためのBIT.x=xのときのFxの値は,変数e1.
bit2 : BITのクラス
概要図の配列Gxを計算するためのBIT.x=xのときのGxの値は,変数e2.
以上,ABC256Fの解法でした.
<参考解説リンク>