Codeforces Round 517 (Technocup 2019 Elimination Round 2)

スポンサーリンク

A. Cram Time

合計 $k$ を達成するには $\sum_{i=1}^k i\leq a+b$ が必要です.この必要条件のもと達成できます.$\{1,2,\ldots,k\}$ の部分和で $\sum_{i=1}^k i$ 以下の値を好きに作れることを示せばよく,これは大きい方から貪欲していけば帰納法で示せます.

B. Minimum path

答えの先頭から順に決めていきます.特定のパスは作らずに,あるマスまで答えと同じ文字列で到達するときの最小コスト(余せている変更回数の最大値)を持ちます.

C. Triple Flips

十分長ければできるというのが結論です.

「$N$ が十分大きいときに $N$ が小さい場合に帰着」「$N$ が小さい場合の解法」の 2 パートを実装しました.後者は最短路問題でよいです.

前者は,末尾が $0$ ならばそのまま $N$ を $1$ 減らし,そうでない場合には suffix に操作して,「$1$ 手で長さを $3$ 減らす」または「$2$ 手で長さを $6$ 減らす」ができることが確認します.$8$ 通り場合分け気合実装などをしました.

D. Familiar Operations

最悪ケースの操作回数を適当に見積もると,指数の合計が $30$ 程度以下の範囲だけで探索すればよいことになります.素数の頻度列として可能なものを分割数だけ列挙します.

これらの状態では約数の個数が同じ状態も多くあるので,最終状態の約数の個数を決め打って多点スタートで最短路問題をすることで,最終状態の約数の個数を決めた場合の答がまとめて計算できます.

E. Rain Protection

比較的やるだけではあります.端点が $(x_1,0), (x_2,h)$ である状態を座標平面上の $(x_1,x_2)$ に対応させます.各時刻の要請は,

  • そもそも達成不可能
  • $(x_1,x_2)$ が特定の点のときに達成可能
  • $(x_1,x_2)$ が特定の線分上のときに達成可能

となります.特定の点も長さ $0$ の線分と思うことにして,これら線分を求めておきます.あとは元の問題の設定を忘れて,点 $(x_1,x_2)$ に関する問題を解きます.

解を二分探索することにします.時刻を順に見ながら,その時刻に存在可能な $(x_1,x_2)$ の領域がどのようになるものかを調べます.

領域に対する操作は次のようになります:

  • 移動:$[-d,d]\times [-d,d]$ の形の正方形との Minkowski Sum をとる.
  • 各時刻の要請:ある線分上に制限する.

領域は空にならない限り常に線分であることが言えるので,この線分を管理します.

Minkowski 和はいくつかの半平面($1$ 次不等式)として書くことで線分との交わりを求めました.

CodeForces
スポンサーリンク
シェアする
maspyをフォローする
maspyのHP
タイトルとURLをコピーしました