A bolt out of the blue

競プロ、その他勉強したことなど

AtCoder Beginner Contest 102 参加ログ

ABC102に参加しました

AtCoder Beginner Contest 102 - AtCoder Beginner Contest 102 | AtCoder

 

実力:緑色(最高R: 1007, 現R: 915)

 

今回は約30分おくれて参加(20:30~のところ、21:00~)。

 

これからは毎週参加して、レポートをこんな感じで書くようにしたい

 

A, B問題

この二つの難度はいつも通りで、標準入出力さえできて焦りさえしなければ、解ける問題

 

C問題 Linear Approximation

僕のレベルだと、C問題を解くのに30分以上はかかる。今回もそんな感じ(約34分)だった。

 

今回の僕の思考を整理すると、

  1. 問題文よく読む
  2. 平均値の周りを調べればいいんじゃね?コードガリガリ- => WA
  3. 平均じゃダメなのか、、、何がおかしいの、、、?
  4. なんか極端なテストケース突っ込んでみるか
  5. BruteForceで調べると、確かに答え違うな、、、
  6. おk、平均、お前はダメだ。medianこそ正しい => AC

 

問題

WA一回で済んだのは僥倖だったものの、この思考プロセスには問題がある。

 

コンテストは時計を見ながらやっているので、各プロセスにかかった時間はだいたい把握している。以下の通り。

1: 5 min,

2: 12 min,

3: 3 min,

4: 7 min,

5: 5 min,

6: 2 min

 

 

3~6までに17 minもかかっていて、結局はじめから解き直しているのと同じになっている。

 

これは、2. で問題が正しく解けることの証明をしていないからだ。

 

反省点

次からはもう少し踏み込んで考え、証明に到るようにする。

 

D問題 Equal Cut

Dは解けるか解けないか2:8くらいの割合なのだが、今回は8の方だった。

 

今回の僕の思考を整理すると、

  1. 問題文を読む
  2. 全部調べようとすると組合せ爆発するから、何かしらうまい方法を考えなきゃいけないな
  3. 総和/4の値を超えるかどうかで数字を分けたらどうかな、、、
  4. quantileを超えたり超えなかったりで数字を分けられないかな、、、
  5. 時間切れ

 

こんな感じ。

 

解説を読んで自分なりに解説してみる

PQRSの切り口をleft, center, rightとする。

centerを固定すれば、

 

PとQを同じ大きさにするようにしてleftが決まり、

RとSを同じ大きさにするようにしてrightが決まる。

 

これで組み合わせはN通りしか無くなるので、全ての値を計算して最小値を出せば良い。

もしleft, rightの決定がO(1)で済むなら、全体の計算量はO(N)で済む。

 

あとは個々の計算量をうまく減らせるかどうかの問題になる。

 

"total(L, R) # left~right区間の値の和を返す" のような関数を用意しておいて、この関数はただすでに計算済みの値を返すようにする。

 

こうすれば、leftとrightの決定にも使えるため、O(N)を担保できる。

 

反省点

結局、「組合せ爆発をどうやって回避するのか」が最も重要なところだったようだ。

 

僕の思考プロセスのうち3も4も、与えられた数字をどうやって分けるかしか考えられていなかった。

 

よって今回の反省点は、

  1. もっと大局観を持って設問に臨むこと(今考えていることがダメそうかどうかを常に評価すること)
  2. 計算量にシビアになること

 

結果 

R915 => R964 (49 up !!)

時間通りに参加してたらもっと上がってたかも、、、