yukicoder No.885 アマリクエリ
Ai:=Ai%X1,Ai:=Ai%X2,...とmodを取っていくとき、値が変化するのはAi≥Xkであるようなkについてだけである。また値が変化するときは必ず半分以下になるので、変化する回数は初期値について高々log2Aiである。そこで、各Aiについて、Xk0≤Aiであるような最小のk0∈[1,Q]を求めてAi:=Ai%Xk0とし、Xk1≤Aiであるよな最小のk1∈[k0,Q]を求めてAi:=Ai%Xk1とし……を繰り返して、各クエリで総和がどれだけ減るかを記録する。この操作は例えばSparse Table上の二分探索でできる。
A:=maxiAiとするとき、計算量はO(N(logAlogQ+logN))。
コンテスト中は上の方針でやったのだが、よく考えると、順序付き集合にA全体を入れておいてクエリごとにシミュレーションすれば十分だった。
先読みできる設定だとまずそれを利用したくなるけど、良し悪しありそう。