Upgrade to Pro — share decks privately, control downloads, hide ads and more …

競技プログラミングへのお誘い@阪大BOOSTセミナー

Aoyama Koki
December 15, 2024

 競技プログラミングへのお誘い@阪大BOOSTセミナー

Aoyama Koki

December 15, 2024
Tweet

Other Decks in Programming

Transcript

  1. 競技プログラミングへのお誘い 大阪大学大学院 情報科学研究科 CS専攻伊野研究室 D1 青山 昂生 2024/12/15 1 元画像:

    TCO19ブログ https://www.topcoder.com/blog/konichiwa-community-the-tco19-japan-regional-event-rises-up
  2. kotamanegi (@small_onions) CS専攻 並列処理工学講座 伊野研究室 D1 競技プログラミング ICPC2024 World Finalist

    ICPC2024 Yokohama 銅メダル AtCoder アルゴ橙 (304位/117926人) ヒュ黄 (142位/5623人) 2024/12/15 2 自己紹介 今日は競技プログラミングの話をします 名前 趣味 競プロ 実績 所属
  3. 2024/12/15 4 体験談 “ICPC 2021 Asia Yokohama Regional Problem K

    の想定解と、 そこから派生した割当問題に対する謎アルゴリズムに関する 論文を書きました。 競プロは業務の役に立つ!” 山口 勇太郎 先生 理論計算機科学や機械学習の論文が書ける(こともある) 競技プログラミングの テクニックを活用 Xポスト: https://x.com/preferred_jp/status/1727243266654093401
  4. • イントロダクション • 競技プログラミングの面白さ ◦ 求められるスキルの種類 ◦ 実際の問題例 ◦ 実装テクニックの紹介

    • 競技プログラミングとコミュニティ • 競技プログラミングと外部のつながり • まとめ 2024/12/15 6 もくじ
  5. 2024/12/15 7 競技プログラミングで求められるスキル 数学的思考力・プログラミング力・正確性が求められる 数学的思考力 問題文から本質を見つけ、 適切に簡略化する力 自然言語で書かれた要件を 簡潔な条件に読み替えて 実装しやすいようにまとめる

    要件整理や解決アイデアの 着想に役立つ 正確性 問題文を正確に読み プログラムをバグなく 適切に実装する力 精度と速度のバランス感覚 や実装テクニック、経験などを 活用し高い精度を実現する 人生のあらゆる場面で 役に立つ プログラミング力 プログラムを 素早く実装する力 タイピング速度の向上や 文法への理解など 総合力が試される ソフトウェア開発に 直接的に役立つ
  6. 2024/12/15 8 競技プログラミングで求められるスキル 数学的思考力・プログラミング力・正確性が求められる 数学的思考力 問題文から本質を見つけ、 適切に簡略化する力 自然言語で書かれた要件を 簡潔な条件に読み替えて 実装しやすいようにまとめる

    要件整理や解決アイデアの 着想に役立つ 正確性 問題文を正確に読み プログラムをバグなく 適切に実装する力 精度と速度のバランス感覚 や実装テクニック、経験などを 活用し高い精度を実現する 人生のあらゆる場面で 役に立つ プログラミング力 プログラムを 素早く実装する力 タイピング速度の向上や 文法への理解など 総合力が試される ソフトウェア開発に 直接的に役立つ
  7. 2024/12/15 9 実際に出てくる問題例: 区間和 問題 数列が与えられます。 以下の質問が複数個与えられるので、全て処理してください。 • 質問: 〇

    番目から △ 番目までの数字の総和を答えてください。 2 5 3 4 9 7 4 1 数列 2番目~4番目 5+3+4 = 12 4番目~7番目 4+9+7+4 = 24 質問 一見簡単に見えるが・・・?
  8. 2024/12/15 10 定義通りの解法 問題文の通りにプログラムを書くと、実行速度が遅いプログラムとなる 2 5 4 1 数列 …

    200万個の数字 質問 … 100万個の質問 計算量 100万個の質問 (質問ごとにおおよそ) 100万回の足し算 x 1兆回の足し算 = 数時間ほどかかりそうな計算量。 もう少しマシな方法はないか?
  9. 2024/12/15 12 解法: 累積和 予め先頭からの総和を求めておくことで素早く処理できる 元の数列 累積和数列 0 2 7

    10 14 23 30 34 35 2 5 3 4 9 7 4 1 質問 2番目~4番目 14 - 2 = 12 1番目~4番目 14 1番目 2
  10. 2024/12/15 13 解法: 累積和 予め先頭からの総和を求めておくことで素早く処理できる 元の数列 累積和数列 0 2 7

    10 14 23 30 34 35 2 5 3 4 9 7 4 1 質問 4番目~7番目 34 - 10 = 24 1番目~7番目 34 1番目~3番目 10 累積和を求めておけば たった1回の引き算で 答えが求まる。 計算量を議論するのが 競技プログラミングの 楽しみの一つ
  11. 2024/12/15 14 競技プログラミングで求められるスキル 数学的思考力・プログラミング力・正確性が求められる 数学的思考力 問題文から本質を見つけ、 適切に簡略化する力 自然言語で書かれた要件を 簡潔な条件に読み替えて 実装しやすいようにまとめる

    要件整理や解決アイデアの 着想に役立つ 正確性 問題文を正確に読み プログラムをバグなく 適切に実装する力 精度と速度のバランス感覚 や実装テクニック、経験などを 活用し高い精度を実現する 人生のあらゆる場面で 役に立つ プログラミング力 プログラムを 素早く実装する力 タイピング速度の向上や 文法への理解など 総合力が試される ソフトウェア開発に 直接的に役立つ
  12. 2024/12/15 15 実装テクニック: 区間の扱い方 区間は半開区間で扱うと楽に実装できる 数直線 半開区間 の世界 1 ≤

    𝑥 < 3 3 ≤ 𝑥 < 5 1 3 5 閉区間 の世界 1 ≤ 𝑥 ≤ 3 3 ≤ 𝑥 ≤ 5 右側の端点を区間に含めない
  13. 2024/12/15 16 実装テクニック: 区間の扱い方 区間は半開区間で扱うと楽に実装できる 足し算 数直線 半開区間 の世界 1

    ≤ 𝑥 < 3 3 ≤ 𝑥 < 5 1 ≤ 𝑥 < 5 𝑥 = 3 での区間重複がない 1 3 5 閉区間 の世界 1 ≤ 𝑥 ≤ 3 3 ≤ 𝑥 ≤ 5 1 ≤ 𝑥 ≤ 5 と 𝑥 = 3 𝑥 = 3 での区間重複
  14. 2024/12/15 17 実用例: 二分探索 二分探索も半開区間で書くと短く書ける int key = 8; //

    検索したい数字 int bot = 0; int top = n-1; while (bot <= top - 1) { int mid = (bot + top) / 2; if (a[mid] == key) { bot = mid; break; } else if (a[mid] > key) { top = mid - 1; } else { bot = mid + 1; } } 閉区間 場合分けが多い 添字に+1,-1が出てきて面倒
  15. 2024/12/15 18 実用例: 二分探索 二分探索も半開区間で書くと短く書ける int key = 8; //

    検索したい数字 int bot = 0; int top = n; while (abs(bot - top) > 1) { int mid = (bot + top) / 2; if (array[mid] <= key) bot = mid; else top = mid; } int key = 8; // 検索したい数字 int bot = 0; int top = n-1; while (bot <= top - 1) { int mid = (bot + top) / 2; if (a[mid] == key) { bot = mid; break; } else if (a[mid] > key) { top = mid - 1; } else { bot = mid + 1; } } 閉区間 半開区間 場合分けが減った 添字が簡潔になった
  16. 2024/12/15 20 競技プログラミングの形態 コンテスト時間と解の評価指標が違う2タイプがある アルゴリズム部門 ICPC AtCoder CodeForces ヒューリスティック部門 AtCoder

    ICPC CodinGame 代表例 競技時間 短め (2時間~5時間) 長め (8時間~2週間) 問題の要求 厳密解 (必要十分な解を早く作る) 近似解 (良い解を作る)
  17. 2024/12/15 22 ICPCの特徴 3人1チームで戦うチーム戦 チーム戦 PCは1つ 公平性 同大学の3人1チームで 協力して戦うチーム戦 個人戦の要素に

    +α で チームワークや 協力要素が含まれる 5時間の長丁場なので 体力管理や食事休憩の タイミングも重要 予選参加の足切りはなく コンテストに誰でも参加可能 本番でよい成績を残せば どんなチームでも次の コンテストに出られる 逆に悪い成績を取っても 他のチームに悪い影響を 及ぼすことはない チームで1台のPCを 共有して使う PCに触れない時間が多いため 実装方針の立案や 数理構造の考察の 重要性が高い 順位付けルールの仕組みから、 序盤のテンポが勝負を分ける
  18. 2024/12/15 23 ICPCの仕組み 4段階の大会があり、勝ち抜くことで次の大会に出られる仕組み ICPC World Finals Asia Pacific Playoff

    横浜 台湾など 日本 世界大会 エリア別 決勝大会 エリア別 予選大会 他7地域それぞれ Playoff 国別 予選 台湾 韓国 ベトナムなど … … … …
  19. • コンテスト中は生配信 + 順位表公開 ◦ あなたの「推し」チームを応援しよう ◦ コーチたちによる解説もある • 直近の横浜大会の情報

    ◦ 日時: 12/22(日) 09:30 – 15:30 ◦ 順位表: https://icpcsec.firebaseapp.com/ ◦ 配信もある ◦ おおよそ15位以上で次の大会に進める 2024/12/15 25 観戦の楽しみ 観戦も楽しい。まずは様子を見てみませんか? 生配信 結果発表 (Yes/No) 写真の切り抜き元: https://www.youtube.com/watch?v=5LdrFxifW54
  20. • 略称: JAG (Japanese Alumni Group) • 日本特有のユーザ主導型コミュニティ ◦ 模擬予選などのサービスをJAGが提供

    ◦ 本番コンテストの運営にも関わる • 来年度の活動に向けてスタッフ募集中 ◦ ICPC経験は関係なし ◦ メーリングリストだけの様子見もできます 2024/12/15 26 ICPC OB/OGの会について ICPC支援に興味がある方はJAGに入りましょう! 写真の引用: https://icpc.iisf.or.jp/2022-yokohama/asia-yokohama-regional-contest-2022/
  21. 2024/12/15 27 競技プログラミングの形態 コンテスト時間と解の評価指標が違う2タイプがある アルゴリズム部門 ICPC AtCoder CodeForces ヒューリスティック部門 AtCoder

    ICPC CodinGame 代表例 競技時間 短め (2時間~5時間) 長め (8時間~2週間) 問題の要求 厳密解 (必要十分な解を早く作る) 近似解 (良い解を作る)
  22. 2024/12/15 28 AtCoder 簡単なものから難しいものまでバランスよく揃う Beginner Contest Regular Contest Grand Contest

    初心者でも気軽に 参加できるコンテスト 7問100分で 簡単な問題も多いため 演習にピッタリ 中級者以降でも 問題を解く爽快感がある 頂上決戦用の 最高難易度コンテスト 6問180分で 極めて難しい問題が並ぶ 問題の品質面について 上級者から 絶大な信頼がある 難易度が高い問題が多い 中上級者向けのコンテスト 5問120分で ほどよく難しい問題が並ぶ Ad-hocな問題も多く BeginnerとGrandの橋渡し をする役割のコンテスト 毎週土曜日 21:00 – 22:40 毎月1回 日曜日 21:00 – 24:00 毎月2回 日曜日 21:00 – 23:00 裏メニュー 99%は大満足の内容。 興味があればまずは過去問を見よう。
  23. 2024/12/15 29 競技プログラミングの形態 コンテスト時間と解の評価指標が違う2タイプがある アルゴリズム部門 ICPC AtCoder CodeForces ヒューリスティック部門 AtCoder

    ICPC CodinGame 代表例 競技時間 短め (2時間~5時間) 長め (8時間~2週間) 問題の要求 厳密解 (必要十分な解を早く作る) 近似解 (良い解を作る)
  24. 2024/12/15 30 ヒューリスティックコンテスト いわゆる「普通の」コンテスト。Kaggleやコンペ系もこちら寄り 問題例 特徴 • エリアを低コストでカバーできるよう放送局の出力強度を決める (AHC020) •

    共通部分を最大化しながらしりとりをする (AHC028) • 植物の種の交配計画を立てる (AHC035) • なるべく良い近似解を求めるコンテスト • 出題問題は多くの場合で厳密解が求めづらい テクニック • とりあえず 貪欲 + 焼きなまし法 • 解を少し変える近傍遷移を考察 • 評価関数を変更する • モンテカルロ法: ランダムに計算した結果を集計して意思決定
  25. • 今年度のICPC戦績 ◦ 国内予選 • 阪大からの参加チーム 9チーム • 横浜大会進出 2チーム(5位・14位/354チーム)

    ◦ 台湾大会 1チーム参加・Playoff進出予定(24位/110チーム) ◦ 横浜大会参加の2チームにもご期待ください • AtCoderなど他のコンテストにも参加 ◦ 第五回日本最強プログラマー学生選手権: 4人 大学別ランキングで同率3位* (東大16人、東工大9人、東北大4人) ◦ コンテストの後には部内で感想戦をしています 2024/12/15 32 阪大の取り組み①: コンテスト参加 ICPCをはじめとして様々なコンテストに参加している 阪大情報科学研究科とIISFからは 場所の提供・旅費その他の支援をいただき 大変助かっております *@potato167_longさんの分析に基づく。 … 合計84人 (Osaka University)
  26. • 昨年度はOUPC2023を開催 ◦ 1/6-7 大阪大学中之島センター ◦ 参加者70人 ◦ Day1 阪大セット

    / Day2 北大セット • 今年度もOUPC2024を開催 ◦ 3/15-16 大阪大学中之島センター ◦ 参加をお待ちしております 2024/12/15 33 阪大の取り組み②: OUPCと大学連携 競技プログラミング部「RAINBOU」として、 OUPCなど外部との連携も積極的に行っている 会場を提供してくださる 大阪大学ありがとうございます
  27. 2024/12/15 35 産業活用 – ALGO ARTIS社の例 コンテストで培った技術で、社会インフラを最適化 *COI開示: 青山はALGO ARTIS社より給与を受け取っています。

    この発表やスライドは所属組織を代表するものではありません。 東北電力様: 配船計画 日本触媒様: 生産計画 関西電力様: タンク繰り
  28. 2024/12/15 36 ALGO ARTISと競プロ 競プロ技術を活かしてヒューリスティック最適化を実装! ALGO ARTIS Impact Report 2024

    より 問題特性を掴むことが 性能向上のために不可欠。 競プロで学んだ試行錯誤力が役立つ。 この発表やスライドは所属組織を代表するものではありません。
  29. • 本スライド中に利用されているアイコンはMaterial Design Iconを含みます。 ◦ https://github.com/google/material-design-icons/tree/master ◦ Apache License 2.0の元でライセンスされています

    • 本資料の内容は個人の見解に基づくものであり、所属組織を代表するものではありません。 2024/12/15 38 ライセンス表記など