A. Metro
$1\to r\to s$ の形の経路を考えます.
B. Alice and Hairdresser
$L$ より大きいところからなる極大区間を数えます.
これは(端を適切に処理する必要がありますが基本的には)区間の左端の個数,つまり $a_{i-1}\leq l$ かつ $a_{i}> l$ となる $i$ の個数です.これを更新のたびに差分更新します.
C. Lucky Days
$T_1$ 周期で考えます.区間 $1$ は常に同じ場所にあり,区間 $2$ が $T_2$ 間隔で発生(これが移動していく)と考えます.
区間 $2$ の左端は,$L_2$ からはじめて $\gcd(T_1,T_2)$ 周期でずらしていくことができます.このうち一番良い感じの始点を選びます.$L_1$ になるべく近い始点 $O(1)$ 個を試します.
D. Refactoring
まず,好きな位置に $1$ 回以下変換できると思うことにします.変換前後で異なる文字列があった場合,それらの最初の不一致,最後の不一致を見ると,変換の様子がだいたい分かります(極小な変換が決まります).
極小な変換が$X\to Y$ という変換であるとき,「最初の出現に $1$ 回だけ変換を行う」という設定から,ここより手前での変換が行われないようにします.このためには,変換ルール $A+X+B\to A+Y+B$ であってなるべく $A,B$ が長いものを採用します.$X,Y$ から始めて前後に伸ばせるだけ伸ばして変換ルールを作り,実際に条件が成り立つかを確認します.
E. Segments on the Line
答で二分探索します.しきい値以下の値だけを適当に取り出して座圧すれば,次のような問題になります:いくつかの区間がある.そのうち $M$ 個以下を選んで,和集合の大きさを最大化せよ($K$ 以上であるか判定せよ).
包含のある区間のうち小さい側を消して,区間が単調な状態にします.これで区間を昇順に使っていく dp をすればよいことになります.区間を $1$ 枚追加するたびに,$O(N)$ 時間,二分探索判定問題が $O(MN)$ 時間で解けて,これに二分探索の $\log$ がつきます.
F. Tree and XOR
木上のパス $i\to j$ 上の辺重みの総 XOR は,根から $i$,根から $j$ までの辺重みの総 XOR と等しいです.このことから木の設定はすぐに要らなくなって,次の問題になります:列 $A$ が与えられるので $A_i\oplus A_j$ のうち昇順 $K$ 番目を求めよ.
答の XOR を topbit から順に確定させていきます.計算の途中時点では,答は $ANS=0110******$ のように,下位 bit がワイルドカードの状態と考えられます.また,$K$ は,「$ANS$ とマッチする $A_i\oplus A_j$ の中で $K$ 番目」が答となるような状態にしておきます.
各 $i$ に対して,$A_i\oplus A_j$ が $ANS$ とマッチするような $j$ 全体を保持します.$A$ をソートしておけば,このような $j$ 全体は区間です.$ANS$ の次の桁を決めると,マッチする区間は現在保持している区間を左右に分割する形になるので,これを計算し,区間の長さの和と $K$ を適当に比較すればある桁の状態を確定させて次に進むことができます.
G. Jellyfish Nightmare
与えられる凸多角形を $A$ とします.それぞれの障害物(両側の壁と円)$C$ を,$\{x\mid A+x\cap C\neq \emptyset\}$ に置き換えて考えます.これは,$C$ と $-A$ の Minkowski 和をとるということです.すると,両端に壁があり,道中に適当な障害物が落ちていて,(多角形ではなく)点が下から上に進むという設定になります.
障害物を間引いて,左壁から右壁への「障害物からなるパス」がなくなるようにすることが目標です.障害物の交わりをグラフの辺として,グラフの $(s,t)$ 最小カットを求めることに帰着できます.
問題となるのは,障害物同士の交わりがあるかどうかを確認する部分です.左壁,右壁の扱いは簡単で,円と $-A$ の Minkowski 和同士の交わりが調べるものです.$C_i,C_j$ を円として,$C_i-A$ と $C_j-A$ が交わるかどうかを調べます.これは $(C_i-A)-(C_j-A)$ が原点を含むかどうかということです.
$$0\in (C_i-A)-(C_j-A)\iff 0\in (C_i-C_j)-(A-A) \iff (C_i-C_j)\cap (A-A)\neq \emptyset$$
と変形できます.これで,判定すべきものが「円と凸多角形が交わるか」というものになりました.円の中心をとれば,点と凸多角形の距離を求めればよいということになります.点と凸多角形の内外判定をしたあと,点と辺の距離をたくさん計算という方法でできます.誤差がシビアなので整数だけで計算する必要があるかもしれません.
