2021年2月27日土曜日

Toph - Subset of Master Shifu

更新がなければwavelet matrixで解ける。更新がある場合、更新が起こる位置が高々6種類しかないことを利用できそう。列BBA1,...,A6A_1, ..., A_6をそれぞれ含む/含まないという分類によって、26=642^6 = 64個の列に分解すると、更新は個々の部分列に対する定数加算として記録できる。質問クエリに対しては、各部分列の[L,R][L, R]に対応する区間について「XX以下の要素は何個あるか?」という問いに答えられれば、その総和がKK以上となるような最小のXXが答えになるので二分探索できる。これはやはりwavelet matrixでできる。

計算量は、A=max(maxiAi,maxiCi),P=maxiPiA= \max(\max_i A_i, \max_i C_i), P=\max_i P_iとして、クエリあたりO((log(AN))22P){O}((\log (AN))^2 2^P)となる。(二分探索とwavelet matrixの処理が共にO(log(AN)){O}(\log (AN))。)かなり重いがQ=104Q=10^4で3秒なのでぎりぎり通る。

editorialを読んだ。ほぼ同じことをやっているようだが、wavelet matrixを64個用意する必要はなくて、1個用意すればほかはその列全体に定数を足したものになっている。確かに。オーダーは変わらないがだいぶ速くなった。