雑記

いろいろ

PythonとC++でAtCoder黄色になった話

はじめに

先日のABC159で無事黄色になることができたので、いわゆる色変記事を書こうと思います。

やったこと

AtCoderを始めるまで

atcoderのアカウント自体は1年生の6月くらいに作っていたのですが特に問題を解くでもなく時間が過ぎて行きました。ところが1年生の2月にとあるきっかけがあり、競技プログラミングやってみようかなぁと思い始めることになりました。一応Pythonを独学でやっていたのと、授業でも扱ったことがあったので言語は自然にPythonを選んでいました。とはいえライブラリとか細かい部分は全然知らなかったので手探りという感じでしたね。また高校数学は一通り学んでいたので初めの方はかなりスムーズだった気がします。また計算量の概念も授業でちょっと扱っていたので基本は理解していたつもりでした。

灰色&茶色編

これをやりました。

qiita.com

あと蟻本も買いました。これ系の本は一冊手元にあるといいと思います。

緑編

蟻本とけんちょんさんの記事を参考に問題を埋めて基礎的な知識を得て行きました。 qiita.com

水色編

旧abcのdらへんを埋めていました

この辺からは問題を解きながら知らない知識を得ていく感じになります。また、蟻本に乗っているような名前のついたアルゴリズム以外に「典型的な考え方」(操作を逆順に考えるとか)も吸収するのが大事だと思います。

青色編

atcoder problems の青difficultyと黄difficultyを埋めていました。この辺から新ABCのF問題がいい感じに解けるようになりレートも好調に伸びて行きましたが、青後半になると最後の一押しが足りない状態が続き、青上位をゆらゆら揺れていました。そこで黄色になるには青diffくらい全部埋めなきゃ駄目だろうと考え、取りあえず全部埋めました。ここからも時間がかかるのですが、春休み+コロナで持て余した暇を利用して精進していたら何とか黄色にたどり着くことができました。

現状

現在の精進具合はこんな感じです。一応青diffは全て、黄diffは半分くらい埋めました(が、パフォ推定の仕組みが変わったため今は青diffもちょっと残っています...) いわゆる虚無埋めをしていないので問題数は少し少ないかもしれません。

最近はcodeforcesもちょっとやっています(生活リズムが正しいのであんまり出れていませんが)。

まとめ

とにかく問題を解こう!!

C++Pythonの使い分け

去年までは完全にPythonオンリーだったのですが、少し定数倍をサボるとTLEするなど辛かったのでC++を勉強し始めました。やっぱりC++は早いです(当たり前)。とはいえPythonが光らない場面がないわけではなく、多倍長を扱いたい時であったり、そうでなくとも制限時間に余裕があれば簡潔に書けるpythonは強いと思います。またnumpyやscipyが使えるのも大きな利点です(僕は全然使いこなせてませんが...)。今はまだPythonの経験値の方がはるかに高いので、これは間に合うだろうという問題はPythonを使って、ちょっと怪しいなぁというものだけはC++を使っていますが、これからはC++オンリーになるかもしれません。

結局どっちがいいのか?

青までならpythonでも全然大丈夫だと思いますが、黄色以上だと少し計算量の悪い解法(logが付いてしまうなど)でもC++なら通せたりと少し不利に働くことも多いと思います(もちろんpythonで橙に行ったmaspyさんのような人もいるので無理という話ではありません)。あとは情報の問題もあります。いろんな人の解説記事や蟻本は大体C++で書かれているので、そうしたものを参考にするのにもC++はできた方が良いと思います。なので「自分は競プロを無茶苦茶頑張るぜ」っていう人はC++を勉強すればいいんじゃないでしょうか。もちろん今できる言語があるなら僕みたいに取りあえずそれでやってみて辛くなったらC++を勉強してみるのでもいいと思います。

ライブラリ

今ライブラリ(コピペできるようにしているコード)として持っているアルゴリズム、データ構造は以下の通りです。

高速フーリエ変換はscipyにあるので持っていません。

知識とか典型

メモ程度に今ある知識を書いておきますが、ライブラリとは異なり当然抜けも多いと思います。また、個人的メモの側面が強いので独自の呼び方とかが混じってるかもしれません。

  • 探索
    • 二分探索
    • 貪欲
    • 半分全列挙
    • 決め打ち
  • dp
    • ナップザックdp
    • bitdp
    • 桁dp
    • 木dp
    • 全方位木dp
    • dp高速化(累積和、セグ木、bitset)
  • グラフ
    • bfs, dfs
    • 最短経路
      • グラフを改造する
    • 二部グラフ
  • 高速化
    • 累積和
    • imos法
  • その他
    • 包除原理
    • 平均をあらかじめ引いておく
    • 転倒数
    • grundy
    • 差だけ持つ
  • 高校数学の整数、場合の数、確率とかの基本