- https://codeforces.com/contest/924 (VK Cup 2018 – Round 2)
- https://codeforces.com/contest/956 (div1)
- https://codeforces.com/contest/957 (div2)
A. Mystical Mosaic
行に対してとる列集合が,全く同じか重複しないというのが条件になります.
B. Three-level Laser
$i,k$ を決めたとき,$j=i+1$ ととるのが最適です.すると $i$ を決めたとき,$k$ を可能な限り大きくとるのが最適だと分かります.
C. Riverside Curio
各日における種類数を最小化します.種類数を $x_i$ とすると,$m_i\leq x_i$ や $x_i\leq x_{i+1}\leq x_i+1$ が成り立ちます.最短路双対の形ですが,意識しなくても大丈夫だと思います.
D. Contact ATC
$x$ が一致している対を除いておきます.するとどの $2$ つも何らかの風速で同時に原点につくようになります.これが $[-w,w]$ に入るというのが条件ですが,$w$ を超える場合と $-w$ 未満になるものを引きます.適当な座標変換の後に平面走査で矩形領域の点を数えればよいです.
E. Wardrobe
箱を捨てることも許容します.
- [1] はじめて $l$ に到達するまで,種類 $0$ の箱と,いくつかの種類 $1$ の箱を積む.
- [2] そのあとは残っている種類 $1$ の箱を,最も小さいものから貪欲に積んでいく.
という形になります.[1] で使う種類 $1$ の箱と,[2] で使う種類 $1$ の箱を入れ替えることを考えると,[2] では使う箱は「残っているもののうち最小から」というよりも強く,「全ての箱のうちから最小から」という形に限定してもだいたい大丈夫であることが分かります.ただし,最後に置く箱だけはそのような入れ替えはできません.
種類 $0$ の箱すべて,その次に重さの大きな箱から順に,subset sum で書けるもの全体を求める dp をしていきます.その状態から,最小の箱から順に積んでいったときのスコアを計算するという要領で計算します.
ただし 「種類 $1$ の箱で不採用としたものが存在する・しない」というのも状態に含めておき,「最小の箱から順に積んでいったあと,さらに不採用としていた箱をひとつ置く」というパターンも考慮します.
F. Minimal Subset Difference
$f(x)$ を,$x$ に対する問題の minimum difference とします.
多くの $x$ で,$f(x)=\mathrm{digit_sum}(x)\bmod 2$ であろうことは想像できると思います.これが成り立たない $x$ のところだけを上手く計算します.
leading zeros を許して,$x$ がちょうど $18$ 桁だとします($10^{18}$ まわりは適当に処理).
$10$ 種のものからなる $18$ 要素からなる multiset は全探索可能な程度しかありません.これらに対して $f(x)$ を計算して確かめると,$f(x)\geq 2$ になるような multiset は $16000$ 種類程度だと分かります.
これを,その subset に伝搬させていくことで,桁 dp の状態となる
- prefix のいくつかが定まっている(ここでは multiset だけが問題)
- 残りの桁には $0, 1, \ldots, 9$ を自由に使ってよい
というときの答をすべて計算しておくことができます($19$ 万種類程度).
答えを求めるには,$18\times 10$ 状態程度の事前計算された答を読み取っていけばよいです.