2020年1月1日水曜日

JOI2014 春合宿 - 歴史の研究

オフラインなのでMo's algorithmが適用できる。つまり、平衡二分木(あるいはセグメント木+座標圧縮)などを用意して、区間[l,r][l, r][l,r+1][l, r+1]に伸ばすときはdp[Xr+1]+=Xr+1dp[X_{r+1}] += X_{r+1}と更新して、[l,r][l, r][l,r1][l, r-1]に縮めるときはdp[Xr]=Xrdp[X_r] -= X_rとすればよい。[l,r][l, r]から[l1,r][l-1, r][l,r][l, r]から[l+1,r][l+1, r]なども同様である。それぞれのクエリについてmaxdp\max dpが答えになっている。O(NQlogN){O}(N \sqrt{Q} \log N)


平衡二分木を使ったらTLEしてしばらく放置していたが、よく考えると全体のmax\maxにしか興味がないので(優先度の変更可能な)優先度付きキューを使えば十分なのを思い出した。えびちゃんさんの記事にやり方が載っているので、書いたら通った。