きろく

特筆すべき記録のまとめ

JOI Kakisemi Contest 2019:A - マルバツスタンプ2

問題

https://www.hackerrank.com/contests/joi-kakisemi-contest-2019/challenges/challenge-2152

解法

正しいマルバツスタンプは 2 通りしかないので,この 2 つのうち操作が少ない方を採用すればよい.

解答

https://www.hackerrank.com/contests/joi-kakisemi-contest-2019/challenges/challenge-2152/submissions/code/1315900538

 

大手前プロコン 2019:G - 空をかけるピ太郎 (Pitaro, who Leaps through Air)

問題

https://atcoder.jp/contests/otemae2019/tasks/otemae2019_g

解法

N が大きいので,P, Q, R, S, A_i, B_i, C_i, D_i を x, y 座標に分けて座標圧縮をする.また,上下・左右方向にワープ可能な領域をそれぞれ累積和で求めておく.このとき,別のワープ可能な領域が隣り合っているとき,隣り合っているところをまたぐ際にコストが生じるので,累積和を求める段階で 0 を検出したらコストがかかると判定する必要がある.これで各マス間の移動のコストが求まったので,二次元平面上でダイクストラ法を使って (P, Q) から (R, S) の最短距離を求めればよい.O(M^2 * logM).

解答

https://atcoder.jp/contests/otemae2019/submissions/6723072

実装がかなり大変だった.

f:id:babcs2035:20190805161237p:plain

 

大手前プロコン 2019:F - 天秤とコイン (Balance and Coins)

問題

https://atcoder.jp/contests/otemae2019/tasks/otemae2019_f

解法

以下の DP を考える.

dp(i, j) := i 日目で右側に j 枚コインがあるとき,i + 1 日目以降のコストの和の最小値

遷移は,右側にのせるコインは j 枚のまま次の日にいくか,右側にのせるコインを 1 枚増やすかの 2 通りになる.dp(i, j) = min( dp(i + 1, j) + std::abs(M[i][j] - (M[i][N] - M[i][j])), dp(i, j + 1) ) とすればよい.1 ~ k 枚目までのコインの重さの総和を O(1) で得られるようにするため,前処理で累積和を各日ごとにとっておく.O(ND).

解答

https://atcoder.jp/contests/otemae2019/submissions/6701800

f:id:babcs2035:20190805155605p:plain