Super Sequence Scoring System

2 secs 1024 MB
yuki4869's icon yuki4869

この解説は II 問題の解説を理解している前提で書かれています。

II 問題と同様に、遅延セグメント木の各ノードに cnt[a]cnt[a]pair[a][b]pair[a][b] を持たせます。区間の結合方法やタイプ 22 のクエリの処理も同じです。

変更する必要があるのは、遅延作用の表し方です。

今回の各更新は、区間内の値 aa を別の値 f(a)f(a) に変更する操作とみなせます。そこで、遅延作用として、各 0a<M0\leq a<M に対する変換先 to[a]to[a] を管理します。

各クエリに対応する変換は次の通りです。

  • タイプ 11to[a]=(a+x)modMto[a] = (a+x) \bmod M
  • タイプ 33to[a]=(ax)modMto[a] = (a*x) \bmod M
  • タイプ 44to[a]=bto[a]=b, to[b]=ato[b]=a とし、それ以外は to[c]=cto[c]=c

この変換をノード SS に作用させた後のノードを SS' とすると、各 a,ba,b について

  • S.cnt[to[a]]+=S.cnt[a]S'.cnt[to[a]] \mathrel{+}= S.cnt[a]
  • S.pair[to[a]][to[b]]+=S.pair[a][b]S'.pair[to[a]][to[b]] \mathrel{+}= S.pair[a][b]

と更新します。

タイプ 33 の操作では、異なる値が同じ値に移ることがあります。例えば M=4, x=2M=4,\ x=2 のとき、0022 はどちらも 00 に変化します。そのため、更新先への代入ではなく加算を行う必要があります。

次に、遅延作用の合成を考えます。

すでに保留されている変換を gg、その後に新しく作用させる変換を ff とします。元の値 aa は、まず g(a)g(a) に変化し、その後 f(g(a))f(g(a)) に変化します。

したがって、これらを合成した変換を hh とすると、各 aa について h(a)=f(g(a))h(a)=f(g(a)) です。配列で表すと、h.to[a]=f.to[g.to[a]]h.to[a]=f.to[g.to[a]] と求められます。

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

区間の結合と遅延作用の適用には O(M2)O(M^2)、遅延作用の合成には O(M)O(M) かかるため、全体の計算量は O((N+QlogN)M2)O((N+Q\log N)M^2)、空間計算量は O(NM2)O(NM^2) です。