noshi91のメモ

データ構造のある風景

yukicoder 1467 Selling Cars Θ((M + N) M + N log (N))

概要

No.1467 Selling Cars - yukicoder の非常に雑な解説

解法

 k を固定して最小費用流にエンコードすると以下のようになります。 頂点の数値は湧き出しの量です。

f:id:noshi91:20210402231219j:plain

実際には適切に座標圧縮します。 これは series-parallel graph なので最小費用流が効率的に計算できます。

tokoharupage/advent2019.pdf at master · tokoharu/tokoharupage · GitHub

この時点で  \mathrm{O} (M (M + N) \log (M + N)) にはなりますが、log を落とすことができます。

区分線形凸関数に対して必要な操作をグラフに対する操作で雑に表現すると以下の 3 つです。

  •  c \lvert x \rvert の加算
  •  x 負の方向に 1 ずらす
  • 最小値から  x 正の方向に長さ  k x 軸に平行な線分を差し込む

最小値を取る  x が常に非正なので、関数を  \lbrack \mathrm{argmin}, 0 \rbrack \lbrack 0, \infty ) に分けて、線分の列として管理します。  \lbrack \mathrm{argmin}, 0 \rbrack の折れ線の本数をポテンシャルにすると償却できて、線形です。