A. AquaMoon and Strange Sort
どの要素も移動距離偶数になっていないといけません.
特に,奇数インデックスにあったものは奇数インデックス,偶数インデックスにあったものは偶数インデックスに行く必要があります.$i$ 番目と $i+2$ 番目のスワップは可能だと分かるので,この条件化での置換は全部実現できます.
奇数インデックスにあるもの全体,偶数インデックスにあるもの全体をそれぞれソートして上手くいくかをチェックします.
B. AquaMoon and Chess
$1^a, 0, 1^b, 0, 1^c$ のように $0$ で分割された間の $1$ の個数分布をとって,状態を $(a,b,c)$ のように表します.操作は $(\ldots,x,y+2,\ldots)\leftrightarrow (\ldots,x+2,y,\ldots)$ です.
各インデックスごとの偶奇が不変.それぞれの場所に $0$ 個または $1$ 個の $1$ を置いて,そこから $2$ 個単位で余剰になっているものは自由な場所に移動できます.結局答は適当な二項係数です.
C. AquaMoon and Permutations
まず次の基本的な戦略があります.
- ある列および値であって,唯一の行に現れるものがあれば,その行を使用する行として確定させる.
- 使用する行として確定している行と共通の要素があるような行は削除する.
これをなるべくやって,$k$ 個の行が使用確定したとします.
問題文 $2$ 段落目の「at least one position」あたりの制約から,シャッフル前のインデックスで $i$ が確定したときに $n+i$ は削除されます.よって,$k$ 個以上の行が削除済です.決めるべき行が $n-k$ 個,候補の行が $2(n-k)$ 個以下ということになります.
すると,各列について,確定した行で使われていない値は,どれも $2$ 度ずつ現れます(冒頭の戦略をなるべくやった状態では $2$ 個以上現れて,候補行が $2(n-k)$ 個なのでちょうど $2$ 度ずつ).ある行集合 $V_1$ を選ぶとラテン方陣になりますが,この状況だと $V_1$ で選ばなかった行全体 $V_2$ を選んだ場合にもラテン方陣になります.
$2(n-k)$ 頂点のグラフを考えて,両立しないものの間に辺を書くと,$n-k$ 頂点独立集合を数える問題になりますが,さらに $n-k$ 頂点ずつの二部グラフであることや,大きさ $n-k$ のマッチングが存在することも分かっている状況です(マッチングは,初期インデックスでの $i$ と $n+i$ の関係).このことから連結成分ごとに,色 $1$ の頂点と色 $2$ の頂点が同数になるような二部グラフになっています.大きさが半分の独立集合を得るには成分ごとにこの片方を選ぶということになります.
D. AquaMoon and Wrong Coordinate
時刻について,座標の総和が等差数列になります.ここからおかしな時刻は確定します.また,変更方法が $O(M)$ 通りに限定できます.
時刻について,座標の $2$ 乗和が $2$ 次関数になります.ここから変更した値がどれであるかも確定します.
E2. AquaMoon and Time Stop (hard version)
off-by-one の類がややこしくてそもそも愚直がちょっと書きにくいですが,$(t, x)$ の格子点がどこが使えるかを考えるようにします($t$ は時刻で $x$ は座標).

各時刻で,行動可能な点全体は何らかの連結区間に分割できます.この連結区間のそれぞれに対してひとつずつデータ構造を持ちます.
データ構造としては,$(t,x,cost)$ の集合のようなものを持ちますが,時刻経過で変更しなくてよいように組 $(x-t,cost)$ の集合を持ちます.
$(v_1,c_1), (v_2,c_2)$ があって $c_1+|v_1-v_2|\leq c_2$ のときに,$(v_2,c_2)$ を削除.というようにして,必要最小個数の状態を保持するようにします.$v$ でソートした列を管理します.そのまま時刻を進めると壁にぶつかってしまっているような状態が出来ますが,これはその連結区間でのデータにアクセスする必要が生じたときに,列の末尾から順に書き直すようにします.末尾の削除や変更,split, merge 等が行える感じのデータ構造が欲しいということになったので,私は平衡二分木を持ち出しました.(AC 提出によっては deque を上手く使っているものもありそう.)
時刻をインクリメントしながら処理していきます.行動可能な点は区間に覆われていない点全体で,区間が追加されたり削除されたりするということになります.
私ははじめ,このような解法は無理だと勘違いをしました.長方形の $n$ 個の和集合で $2$ 次元平面を分割すると,$O(n^2)$ 個の領域までできてしまうことがあるからです.しかし,行動可能な点全体の連結区間のうち,実際に到達可能な領域に制限すると,行動区間は $O(n)$ 回の区間の分割や併合として管理できます.
区間を追加する(禁止領域が増える)ときは,いくつかの領域が完全に覆われて消えて,両端を含む区間が縮んだり分割されたりします.
区間を削除する(行動可能領域が増える)ときは,上のような勘違いに基づくと大量の区間が増えそうな気がしてしまいますが,実際には両端点を含む既存区間が拡張されるだけです(間に大量の区間ができるときにはそこは到達不可能).
結局,丁寧に実装すれば $O(n)$ 回の平衡二分木操作で解けることになります.
F. AquaMoon and Potatoes
単に $a,b,c$ への点変更が来て,$b_i=a_j=c_k$ となるものを数えると考えてよいです.
クエリ平方分割をします.
バケット内のクエリで追加や削除がされたり求値が来るインデックスを大事なインデックスとします.大事な値も同様に定義します.
大事ではない値については,クエリバケットごとに一度だけ前処理をして,$r$ ごとの答を求められるようにします.
大事な値については,値と求値インデックスごとの ANS を管理するようにします.ある値が変更されたときに,その値の情報を再計算します.大事なインデックスの間の情報を表す適当なモノイドの元を前計算しておくことで,これが可能です.
全体として $1.5$ 乗のような計算量($\log$ の類はつかない)ですが,定数倍は結構重かったです.
