A. Blackslex and Password
$x$ で割った余りがで添字を分類したときに,どの種類も $k$ 個以下という条件です.
ちょうど $k$ 個ずつあるときがぎりぎりで,その次が答えるものです.
B. Blackslex and Showering
すべて計算します.各要素を消したときの値は元の解からの差分更新で求まります.
C. Blackslex and Number Theory
すべてが $K$ 以上であれば,$x=a_i$ を選択することですべて $0$ にできます.
$K$ 未満の数があるとき,それは操作で変化することはありません.よって $c<K$ を固定して,$a_i\to c$ とできるかを判定できればよいです.
$a_i=c$ を除けば,$c+K\leq a_i$ が必要です.剰余で減少するときには $K$ 以上減るからです.これは十分でもあります.$x=a_i-c$ ととれるからです.
D. Blackslex and Penguin Civilization
$\mathrm{popcnt}=n,n-1,n-2,\ldots$ となる回数をそれぞれ最大化します.
$k=n,n-1,\ldots$ 順に,ある $k$ 個のビットを選び,未使用かつその $k$ ビットを含むものを昇順にすべて並べるということになります.選ぶビットも $0,1,\ldots,k-1$ の形が最適であることはすぐに分かります.
E. Blackslex and Girls
難しい.直感が働かずに,幾何をしました.
各 $i$ について使える $(a_i,b_i)$ 全体をプロットすると次のような格子点集合になります.


これらの格子点集合の Minkowski 和に目標の点 $(x,y)$ が入っていればよいということになります.
整数性を気にせずに凸集合の Minkowski 和をとったとき,内部の格子点はすべて作れます.一般に凸集合に対して格子点集合をとる操作と Minkowski 和をとる操作は可換ではないので微妙ですが,今回は大丈夫です.こういうのどうやって証明するのが楽なんでしょうか.定番手法は知らないです.
今回は,$S[0]=0$ としてよく,その場合 $(x,y)$ が入っていれば $(x,y+1)$ も入っています.よって各 $x$ に対して $y$ の最小値を考えて,この凸関数の min-plus convolution と思えばよいです.傾き $-1,0,1$ の境界しかないので,定義域内で $y+x,y,y-x$ の最小値が何かを計算していけばよいです.
F. Blackslex and Another RGB Walking
頂点 $1$ からの距離 $d$ にである点を $d\bmod 3$ で塗ります.
一般に頂点を距離で分類すると,距離 $d$ の頂点の近傍は $d-1,d,d+1$ の $3$ 種の距離がありえますが,本問題は二部グラフであることから,$d-1,d+1$ の $2$ 種しかありません.近傍の距離が $1$ 種ならばその方向に進めばよくて,$2$ 種あるならばどちらが $d-1$ に対応するかは決まります.
G. Blackslex and Penguin Migration
まず適当な点からの最遠点のひとつを求めます.回転対称移動を同一視すれば,これははグリッドの隅なので $(0,0)$ としてよいです.
次に $(0,0)$ からの距離をすべて求めます.$s$ から距離 $1$ の点がふたつあります.回転対称移動を同一視すれば,好きな方を $(1,0)$ としてしまってよいです.
右上隅 $(0,N-1)$ を特定します.これは $(0,0)$ からの距離が $N-1$ かつ $(1,0)$ からの距離が $N$ であるような唯一の点です.前者の必要条件で候補が $N$ 個になっているので,この部分はクエリ $N$ 回で足ります.
最後にすべての点を特定します.これは $(0,0)$ からの距離と $(0,N-1)$ からの距離から求まります.
クエリ回数は $3N^2+N$ 回になり条件を満たしています.
H. Blackslex and Plants
数列 $f$ は次のように分解できます.便宜上,$l$ をひとつずらして,$f(0)$ から足し始めるものとします.
- $0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,\ldots$
- $0,-,2,-,4,-,6,-,8,-,10,-,12,-,14,-,16,\ldots$
- $0,-,-,-,8,-,-,-,16,-,-,-,24,-,-,-,32,\ldots$
- $0,-,-,-,-,-,-,-,32,-,-,-,-,-,-,-,64,\ldots$
$k=0,1,2,\ldots$ 順に,始点から距離が $2^k$ の倍数であるところに,距離の何倍かを足すという形です.
何倍を足すかは $1,1,2,4,8,16,\ldots$ という $2$ べきからわずかに初項をいじったような倍率ですが,これは累積和が $2$ べきになるように調整したものです.
$k$ を固定して解けばよくて,「始点から距離が $2^k$ の倍数であるところに,距離を足す」ということができればよいです.足すものを $ai+b$ のようにして,$2^k$ 項ごとに見たときの区間に $a$ や $b$ を足すという処理になります.
