trsing’s diary

勉強、読んだ本、仕事で調べたこととかのメモ。

AtCoder Beginner Contest 127参加メモ

Q.古戦場とABCと艦これイベントが被るとどうなる?
A.団長・・・団員のみんな・・・すまねえ・・・

ノルマ無し走る走らないも自由の団なので特に問題ないですが。そろそろ4問解けないかなーと私は思うのでした。

結果

A,B,CはAC。Dは提出したけどAC、WA、TLE入り混じったひどい結果、後日AC。E,Fは解説見てAC。

C:Prison

とりあえず図を書けばわかりました。\max L_{i},\,\min R_{i}を見ればいいよね。 f:id:trsing:20190530211901p:plain

D:Integer Cards

これも図を書くと。降順にソートして比較して大きいの計N個とりゃいいねと。
f:id:trsing:20190530214119p:plain

考え方は良かったけどいろいろ実装ミスしたもよう。比較も無駄に多くしてたし。結局どこミスったのかわからなかったのでちょこっとやり方を変えてAC*1。テストケース公開されたら確認する。

解説の方法の方が良さそ。Aを昇順、Cを降順に並び替えて比較、高い方を選択していく。 f:id:trsing:20190530214236p:plain

E:Cell Distance

解説にある通りですね。

  • 行と列を分けて考える
  • 2点固定すると、その数は残りNxM-2マスからK-2マス選択の_{NM-2}C_{K-2}通り。
  • 2点の距離がdの組は(N-d)M^{2}通り(列の場合) f:id:trsing:20190530220150p:plain

数式にすると
\displaystyle{
M^{2} \ _{NM-2}C_{K-2}\sum_{d=1}^{N-1} d(N-d)
}
これを行に対しても同じように。

うーん時間があっても思いつける気がしない。

余談
long = int*int

みたいなコード書いてint*int部がオーバーフローして死んだ。そういや計算途中は勝手に型変換してくれませんでしたね。あとmod取るタイミングやらもミスってたし案外面倒。

F:Absolute Minima

これも解説にある通り。図を書くと、傾き0になる区間、点がf(x)の最小値を与えるxことが直感的にわかるかと。

f:id:trsing:20190530223300p:plain
2点(偶数点)ある場合、傾き0の区間ができる。

f:id:trsing:20190530223326p:plain
3点(奇数点)ある場合、傾き0の点ができる。

ソートして両側をペア(a_{0}とa_{N},\,a_{1}とa_{N-1}、\dots)として考えれば感覚をつかみやすいかも。

次の方のブログがとても分かりやすかったです。

betrue12.hateblo.jp

betrue12.hateblo.jp

余談

aが与えられるたびにソートすると楽なので、とりあえずListにしてSortしました*2。TLE。

On average, this method is an O(n log n) operation, where n is Count; in the worst case it is an O(n2) operation.

https://docs.microsoft.com/ja-jp/dotnet/api/system.collections.generic.list-1.sort?view=netframework-4.8

まあ・・・そうなるな。

じゃあ二分探索してinsertすっか。二分探索はO(\log n)だから余裕やろ!
・・・約1.8秒。ぎりぎり間に合ったけど遅!

This method is an O(n) operation, where n is Count.

https://docs.microsoft.com/ja-jp/dotnet/api/system.collections.generic.list-1.insert?view=netframework-4.8

そういやListでinsertは単にずらしてるだけだからめっちゃ時間かかるんだっけ・・・。それにしてもO(n^{2})でよう間に合ったな・・・。

他の人のコード読んでると、平衡二分探索木というのがよさそうですね。探索も挿入もO(\log n)だとか。

所感

私のなんとなくでなんとかなりそうなのはDまでっぽいかー。

*1:数値と数をペアにして((A_{i},1),\,(C_{i},B_{i})みたいなの)A,C混ぜてソート、大きいのN個とる。別解と同じか

*2:C#使ってます