公式

M - 秘密の数列と分岐するノート / Secret Sequence and Branching Notes 解説 by sounansya


まず \(B=i-1\) の場合、つまり各クエリを時系列順に順に処理する場合を考えます。

この場合の問題は重み付き DSU を用いて解くことができます。具体的には、\(\displaystyle C_i=\sum_{j=0}^i A_j\) とした \(C\) を考えると各クエリでは \(C_r-C_{l-1} \mod K\) に関する情報が与えられるため、重み付き DSU に \(\mathbb{Z}/K\mathbb{Z}\) を載せてクエリを処理すれば良いです。

これを踏まえて \(B\) が一般の場合を考えると、\(i\) から \(B\) に辺を張った木上で DFS を行うことでこの重み付き DSU が undo 可能であれば良いことが分かります。これは普通の undo 可能 DSU のように、経路圧縮をせずに今まで変更した履歴を保持しておくことで実装することができます。

以上を適切に実装することでこの問題に解くことができます。

実装例(C++)

投稿日時:
最終更新: