A. Everything Nim
$a_1\leq a_2\leq \cdots$ としてよいです.$a_i$ が $0$ になるまでの段階をステップ $i$ とすると,ゲームはステップ 1,ステップ 2,ステップ 3,の順に進行します.
$i=N,N-1,\ldots,1$ の順に,ステップ $i$ 開始時点で手番を持っている側が勝つか負けるかを求めていきます.
B. Missing Subsequence Sum
例えば $K=20$ とします.$1,2,4,8$ で $[0,15]$ が作れます.$1,2,4,8,4$ で $[0,19]$ が作れます.これに $21\times 2^i$ の形の整数を追加すると,$21a+b(b\in [0,19])$ が作れます.最後に $41$ を追加すると,$b=20$ に対応するところが $a=0$ を除き作れるようになります.
C. Folding Strip
0, 1 が交互に並べられたパターンを用意すると,どのような文字列もそれにマッチするように折り畳むことが可能です.このパターンにおいて任意の点の両隣に 0, 1 の両方が存在するため,紙の左から順に適切な方向に紙を延長していくことを考えればよいです.
さらに,長さ最小の場合では最終形はこのような交互パターンしかありえません.なぜならば,同じ文字が隣接するパターンに折ってあるとき,そのパターンごと上述にように折り畳むことで長さを減らすことができるからです.
よって最終形は 0, 1 が交互に並べられたパターンにマッチするとしてよいです.さらにこの場合,紙の左端の位置さえ決めれば紙の各場所がどこに来ることになるかは一意に決まるので,それを計算します.
D. Missing Subarray Sum
ちょっと変な解法をした.
解の候補を $O(N)$ 通りに限定し,それらの候補に対して正しさを高速に判定する.という解法です.
まず解の候補を限定します.
すべての subarray sum が分かっているとします.回文の subarray sum について,同じ値のペアがたくさん作られます.$[l,r]$ と $[n+1-r,n+1-l]$ がマッチするからです.$2$ つずつをペアにして相殺していくと,$\lceil n/2\rceil$ 個の値が残ります($a_i$ が positive であることからこれらは distinct です).これらをソートして差分を求めることで,元の列を復元できます.
1 つの subarray sum を消去してあるとします.この場合にも同じ値のペアを相殺していくと,$\lceil n/2\rceil \pm 1$ 個の値が残ります.$\lceil n/2\rceil + 1$ 個の値が残る場合には,このうち $1$ 個を消すことで,$O(n)$ 個の値が復元可能です.
$\lceil n/2\rceil – 1$ 個の値が残るとします.ひとつ何らかの値 $x$ を補完して列を作ることになります.$x$ のソート順を固定する($O(N)$ 通り)と,数列は各項が $x$ の $1$ 次式として復元できます.すべての subarray sum も $x$ の $1$ 次式で,この multiset が与えられているものと一致するように $x$ を定める必要があります.subarray sum の $2$ 乗和は $x$ の $2$ 次式で,この値が目的の値になるという $2$ 次方程式を解くことで $x$ を $O(1)$ 通りに限定します.
このようにして得られた $O(N)$ 個の解の候補が適切かどうかを確認します.これは subarray sum の $0, 1, 2, 3$ 乗和をハッシュとして判定しました.この解法が大丈夫か($O(N)$ 個の解の候補ほとんどすべてで $0,1,2,3$ 乗和が目的の multiset と一致してしまうと,計算量が $\Theta(N^3)$ 時間になってしまう)は証明していませんが,落とすケースはたぶんないでしょう.
E. Connected Cubes
例えば入力が
A | B | C | D |
E | F | G | H |
I | J | K | L |
であるとします.横方向に少しずつ伸ばしていきます.
A | B | C | D | D | D |
E | F | G | H | H | H |
I | J | K | L | L | L |
A | B | C | C | D | D |
E | F | G | G | H | H |
I | J | K | K | L | L |
A | B | B | C | D | D |
E | F | F | G | H | H |
I | J | J | K | L | L |
A | — | B | C | — | D |
E | — | F | G | — | H |
I | — | J | K | — | L |
位置関係を保ったまま空列を挿入した状態にもっていきます.あとは簡単です.すべての色 1, 2, 3, … について
A | 1 | B | C | 1 | D |
E | 1 | F | G | 1 | H |
I | 1 | J | K | 1 | L |
1 | 1 | 1 | 1 | 1 | 1 |
A | 2 | B | C | 2 | D |
E | 2 | F | G | 2 | H |
I | 2 | J | K | 2 | L |
2 | 2 | 2 | 2 | 2 | 2 |
A | 3 | B | C | 3 | D |
E | 3 | F | G | 3 | H |
I | 3 | J | K | 3 | L |
3 | 3 | 3 | 3 | 3 | 3 |
と,各色を連結させるための断面を追加していきます.$50\times 75\times 100$ 程度の直方体で目的を達成することができて,制約の $400000$ には何とかおさまっています.個数の定数倍が想像以上に厳しめでした.
F. Conference
前処理として,左端がすべて異なるという状況に帰着します.同じ左端を持つ区間 $[a,b_1], [a,b_2]$ $(b_1\leq b_2$) があれば,後者を $[a+1,b_2]$ に置き換えても構いません.これを可能な限り繰り返すことで左端が distinct という状況にします.これは $O(N\log N)$ 時間で計算できます(priority queue を使った貪欲マッチングのシミュレーションをする).
$I=\{L,L+1,\ldots,R-1,R\}$ を conference dates にできるかの判定方法を考えます.Hall の定理を使います.部分集合 $s\subset I$ であって,$|N(s)|<|s|$ となるものが存在するかを調べることになります.
この際,$s$ は区間としてよいことが示せます(左端が distinct という仮定がないと反例があります).$s = \{s_1,\ldots,s_m\}$ かつ $s_i+2\leq s_{i+1}$ となる反例に対して,$s$ に $s_i+1,\ldots,s_{i+1}-1$ を追加しても再び反例となるからです($|s|$ が $s_{i+1}-s_i-1$ 増えるのに対して,$|N(s)|$ もこの範囲に左端があるような $s_{i+1}-s_i-1$ 個以下しか増加しません).よって,Hall 条件は区間についてのみチェックすればよいことが分かりました.
そこで予め,Hall 条件に反するような極小区間を列挙しておくようにします.これはセグメント木二分探索で行えます.あとは始点ごとに,どの違反区間も含まないような区間の最大長を求めればよいです.
区間の包含関係を前処理することなどは何度も見ていますが,端点の重複の前処理が重要というのは覚えがなくて驚きました.