ABC199

A - Square Inequality

YesNoをスニペットにしたほうがいいとは前から思ってて。

B - Intersection

AとBではさむ。Aの最大値とBの最小値の差。

C - IPFL

古き良きAtCoderという感じで安心する。入れ替えフラグを持って、入れ替えた状態でswapするときはmod N*2でNを足す。最後の入れ替え処理で悩んでsubstr使ったけどrotateでよかったか(どっちにしろタイピングゲーになるなあ)。

D - RGB Coloring 2

3色なので0,1,2で考える。3通りだけど、DFSして親とは違う色なので2通りしかない。DFS木の根は3通りだけど固定して3倍すればいい。Nが20なので2通りを全部試せばいい。辺が200くらいあるのでグラフの定数倍も考えるとやや不安になるが、まあC++で通らんことはないだろう。グラフが連結とは限らないことに気づくが、まあ独立にやるだけなので何も困難はない(現実的には実装がかなり複雑になりそうで嫌だ)。いい実装が全然浮かばず、しばらくして諦めてEFへ。解けそうなDよりは全然わからないEを考えようと思った。Dは今から実装する。

(追記)実装して1524msでAC。最後サンプルが合わず詰まったのは、既に訪れた頂点の判定を関数の頭から関数を呼ぶ直前に移動したときiをo.iに直し忘れたため。問題が難しいとデバッグできないよねー。引き続き計算量の落とし方を考えてみる。

E - Permutation

ずっとEをやっていたが全くわからなかった。Mは100だけどXとYの組み合わせがN^2くらいしかないからまとめれる。5以下が3個以下だったら4以下も3個以下とか条件を伝播させてなめらかにしとく。Yより大きいのが何個以上とか、X番目より後ろにY以下が何個以上残ってるとか、言い換えてどっちかから貪欲みたいの行けるかと思ったけどうーん。包除もちょっと思ったけどどうやって使うのかというところ。

F - Graph Smoothing

真っ平らになった状態をベースに考える?少し経って、行列累乗が見える。2回操作したあとの期待値を求めるには、1回操作したあとの期待値から1回操作した期待値でいいんじゃ?手で少し計算して悪そうな雰囲気はないのでとりあえず実装。DEに比べ解かれてないわりにやるだけなので不安になるが。行列を作るのにけっこう混乱した。単位行列をベースにする。1つの辺の寄与は1/Mで半分だけ分け与えるので1/(2*M)をあれする感じ。なんか適当に書いてサンプル通っちゃったので提出、AC。