狠狠撸

狠狠撸Share a Scribd company logo
はじめての競技プログラミング OSC 名古屋 2011 8/20 (土) @yak_ex /  新 康孝  (CSNagoya) @rofi
発表の流れ 前半 (45 分 ) :競技プログラミング / サイトの紹介 (@yak_ex) 競技プログラミングとは 競技プログラミングサイト紹介(含む実演) 後半 (45 分 ) :問題 / アルゴリズム解説+ α (@rofi) 基本的なデータ構造 実際の問題に合わせてアルゴリズム解説 競技プログラミングから見た C++0x  (@yak_ex)
自己紹介 氏名: 新 康孝  ( あたらし やすたか ) Twitter ID: yak_ex Web: http://yak3.myhome.cx:8080/junks C++ / Perl  が主戦場 仕事でコードに触れていないので 競技プログラミングで潤い補充 TopCoder  1577  / Codeforces  1762 学生時代に ACM/ICPC 出場、 1 年くらい前に 競技プログラミングに復帰
オープンソースと競技プログラミング オープンソース 世界中の開発者のコードが見られる 世界中に潜在的利用者が居る 競技プログラミング 世界中の参加者のコードが見られる 世界中の参加者と腕を競える もっと被って良さそげなのにいまいちオープンソース界と競技プログラミング界があまり被ってなさそげ -> 布教
競技プログラミングとは 制限された時間内に与えられた問題を解くためのプログラムを作成、その速さと正確性を競う知的スポーツ 「プログラミングコンテスト」で思い浮かべるテーマに合わせたソフトを応募、審査する コンクール形式とは违って机械的に胜ち负けを判定可能
問題の例 ある東西に伸びたものすごく長い道路にホットドッグ屋がたくさんいます。各ホットドッグ屋は東西 1 m/s で移動できます。初期状態が与えられている時に、どのホットドッグ屋間も最低 D m 離れている状態になるまで最低何秒かかるでしょうか? (Google Code Jam 2011 Round1B  抄訳 ) 1m/s D m 最低何秒かかるか?
問題の例 入力例 2 3 2 0 1 3 2 6 1 2 2 0 3 1 1 1m/s D m 最低何秒かかるか? 出力例 Case #1: 1.0 Case #2: 2.5 ← テストケース数  T ← 位置の数 C  距離 D ← 位置 P  ホットドッグ屋数 V C 回 繰り返し T 回 繰り返し 1 ≤ T ≤ 50 -10  ≦P≦10  :整数 V:正の整数 1≦D≦10  : 整数 1≦C≦200 : 整数 ホットドッグ屋数≦10 5 5 6 6 解答例 ←問題文に ある条件
なぜ競技プログラミング? 白黒はっきりするので目標にしやすい コード自体は複雑にならないので、入門書を終えて次に何やっていいか分からない人に最適? 計算量(時間/空間)の感覚が身につく デバッグ力があがる 他人のソースコードを読む力が付く テストケースを考えられる(コーナーケースが考えられるようになる) 何より楽しい
主な競技プログラミング大会 / サイト TopCoder    ○ Codeforces     ○ Google Code Jam    ○ AOJ (会津大学オンラインジャッジ) ACM/ICPC ( ACM 国際大学対抗プログラミングコンテスト) ○ が付いているサイトについて(練習モードで)実演
TopCoder http://community.topcoder.com/tc 競技プログラミングと言えばまずはここ コンテストは複数種開催されているが競技プログラミングとしては  SRM(Short Round Match)  が基本。月 3 回程度。 レーティング有り。 Div1 (1200 以上 ) / Div2  に分かれていて問題が違う 3問  95 分  /  問題によって最大得点が異なる 典型的には  250, 500, 1000 時間に応じて得られる得点が減少していく Coding 75 分->休憩  5 分-> Challenge  15 分 2 秒、 64MB 制限 正誤判定(システムテスト)は競技時間終了後 形式 アクティブ: 8,600 人  1SRM 2,000 人強制限 参加者数 C/C++, C#, Java, VB 使用可能言語 Java  使用による独自 UI システム
Codeforces http://www.codeforces.com/ 比較的最近できたロシアの競技プログラミングサイト。月 4 回くらい。 以前はよく落ちたりしていたが最近はシステムは安定している 英語が読みにくいと言われることが多い Gmail 、 OpenID   でログイン可能 レーティング有り。 Div1 (1650 以上 ) / Div2  があるが一括開催だったり片方のみ開催だったり色々 5 問  120 分  /  最大得点が異なり時間に応じて減少 Challenge  に相当する  Hack   が可能だが 時間枠が分かれていない 実行時間、メモリ制約は問題毎に明示 正誤判定(システムテスト)は競技時間終了後 形式 7,900 人  1Round 1,500 人強 参加者数 Pascal, C, C++, C++0x, C#, Java, PHP, Python, Ruby, Haskell 使用可能言語 Web (Web2.0  による競技  PG  サイトを標榜 ) システム
Google Code Jam http://code.google.com/codejam/ Google  が開催している年に 1 度のお祭り 決勝はオンサイトでやる 勝ち抜き制 予選+ 4 回くらい?予選は  24  時間 各問題に対し、データ量等が少ない  small input  と 多い  large input  がある 提出に時間制限あり( small 4 分  / large 8 分) 問題、 small or large  で得点が異なる small input  は即結果判定有りで、時間中に複数回提出可能 large input  は一発勝負で結果は競技時間終了後判明 得点と、正答累積時間+ 4 分 × (正答迄の)誤答数で順位付け 形式 13,000 人 (2011 予選提出者 ) 参加者数 自由 使用可能言語 Web  (ローカルで実行した結果を提出) システム
AOJ(会津大学オンラインジャッジ) http://judge.u-aizu.ac.jp/onlinejudge/ 日本にあるオンラインジャッジ オンラインジャッジ: 用意された過去問等に対してソースを送信すると自動で正誤を判定してくれるサイト 黙々と練習するのに良い 3,700 人 参加者数 C, C++, Java 使用可能言語 Web システム
ACM/ICPC (ACM 国際大学対抗プログラミングコンテスト ) http://cm.baylor.edu/welcome.icpc http://icpc2011.ait.kyushu-u.ac.jp/ja/home ACM( アメリカ計算機学会 ) 主催のプログラミングコンテスト 大学生対象 チーム制 で 1 チーム 3 人、 1PC 共用 基本オンサイト 国内予選->アジア予選->決勝 4,5 時間 7 ~ 10 問程度 正答数と、正答累積時間+ 20 分 ×( 正答迄の ) 誤答数で順位付け 電子的な事前準備禁止 形式 88 カ国、 2,070 大学、 8,305 チーム (2010) 参加者数 C, C++, Java 使用可能言語 国内予選は  Web システム
実演 TopCoder アカウント登録 SRM 登録 SRM( 今回は Practice) Codeforces Round 登録 Round( 今回は Practice) Google Code Jam Practice
TopCoder  実演 アカウント登録 http://community.topcoder.com/tc Register Now->on TopCoder-> 頑張って入力->メール受信-> URL ref.  http://mainly-coding.blogspot.com/2010/02/topcoder.html SRM 登録 (SRM 開始 3 時間前から ) (Java 実行環境インストール ) http://community.topcoder.com/tc Competitions->Algorithm->Single Round Matches (SRM)->Launch Arena Active Contests-> どれか-> Register SRM Launch Arena  まで↑と一緒 実際には  Active Contests -> Enter Practice  は  Practice Rooms->SRMs-> どれか Challenge  は  Summary  からダブルクリック Practice  での  System Test  は  Practice Options -> Run System Test
Codeforces  実演 設定 http://www.codeforces.com/contests 右上の  Enter  からログイン Settings -> Social  の  Country  に入れておくと国別ランキングに集計 ※ CF / TC 日本参加者比較表 http://yak2.myhome.cx/misc/cfjp.html Round 登録 (Round 開始 24 時間前から ) ログインまで↑と同じ Register Round ログインまで↑と同じ Enter ( 実際には時間になると勝手に  Enter  伺いが出る ) Practice  は 適当な  Round  の  Enter -> Register for Practice Hack  は  Room  からセルをダブルクリック (Practice  不可 ) Hack  するためには  Lock  が必要 Hack  されても  Lock  していなければ再提出が可能
Codeforces  の問題状態遷移 Pretest Passed Pretest Failed 初期状態 Hacked System Test の壁 Passed  System Test Locked Failed  System Test After lock hacked 再提出成功 ハックされる 提出成功 提出失敗 再提出 成功 システムテスト通過 システムテスト通過 ならず ロック ハックされる
Google Code Jam 実演 事前登録 http:// code.google.com/codejam / 実際には  Practice  のところで登録が必要 Practice Input  ファイルをダウンロードして実行、出力を提出 CUI  ツールもできたが未使用なので説明できない 実際には時間制限あり Short input  はリトライ可能、 Large input  はリトライ不可
書籍?コミュニティ プログラミングコンテストチャレンジブック 通称:蟻本 ISBN978-4-8399-3199-5 ,280+ 税 秋葉拓哉 (@iwiwi) ?岩田陽一 (@wata_orz) ? 北川宜稔 (@kita_masa) TopCoder 部 http://topcoder.g.hatena.ne.jp/ Twitter 今すぐフォローすべき競技プログラミング界のスーパーエンジニア http://d.hatena.ne.jp/chokudai/20110617/1308242031 ニコニコ生放送 LayCurse(@laycrs) 、診断人 (@nico_shindannin)
用語集 レーティングが赤い人。殿上人。 Red Coder 深さ優先探索 Depth-first search DFS 幅優先探索 Breadth-first search BFS チャット等で良くある挨拶 Good Luck & Have Fun GL & HF 出題者による問題の解説 Editorial 実行時エラー Runtime Error RE 意味 原語 用語 誤答 Wrong Answer WA チャット等で良くある挨拶 Dynamic Programming DP メモリ制限超過 Memory Limit Exceeded MLE 実行時間超過 Time Limit Exceeded TLE 出力形式エラー Presentation Error PE 正解 ACcepted AC
ご清聴ありがとうございました。

More Related Content

Introduction to programming competition

  • 1. はじめての競技プログラミング OSC 名古屋 2011 8/20 (土) @yak_ex / 新 康孝 (CSNagoya) @rofi
  • 2. 発表の流れ 前半 (45 分 ) :競技プログラミング / サイトの紹介 (@yak_ex) 競技プログラミングとは 競技プログラミングサイト紹介(含む実演) 後半 (45 分 ) :問題 / アルゴリズム解説+ α (@rofi) 基本的なデータ構造 実際の問題に合わせてアルゴリズム解説 競技プログラミングから見た C++0x (@yak_ex)
  • 3. 自己紹介 氏名: 新 康孝 ( あたらし やすたか ) Twitter ID: yak_ex Web: http://yak3.myhome.cx:8080/junks C++ / Perl が主戦場 仕事でコードに触れていないので 競技プログラミングで潤い補充 TopCoder 1577 / Codeforces 1762 学生時代に ACM/ICPC 出場、 1 年くらい前に 競技プログラミングに復帰
  • 4. オープンソースと競技プログラミング オープンソース 世界中の開発者のコードが見られる 世界中に潜在的利用者が居る 競技プログラミング 世界中の参加者のコードが見られる 世界中の参加者と腕を競える もっと被って良さそげなのにいまいちオープンソース界と競技プログラミング界があまり被ってなさそげ -> 布教
  • 6. 問題の例 ある東西に伸びたものすごく長い道路にホットドッグ屋がたくさんいます。各ホットドッグ屋は東西 1 m/s で移動できます。初期状態が与えられている時に、どのホットドッグ屋間も最低 D m 離れている状態になるまで最低何秒かかるでしょうか? (Google Code Jam 2011 Round1B 抄訳 ) 1m/s D m 最低何秒かかるか?
  • 7. 問題の例 入力例 2 3 2 0 1 3 2 6 1 2 2 0 3 1 1 1m/s D m 最低何秒かかるか? 出力例 Case #1: 1.0 Case #2: 2.5 ← テストケース数 T ← 位置の数 C  距離 D ← 位置 P  ホットドッグ屋数 V C 回 繰り返し T 回 繰り返し 1 ≤ T ≤ 50 -10 ≦P≦10 :整数 V:正の整数 1≦D≦10 : 整数 1≦C≦200 : 整数 ホットドッグ屋数≦10 5 5 6 6 解答例 ←問題文に ある条件
  • 8. なぜ競技プログラミング? 白黒はっきりするので目標にしやすい コード自体は複雑にならないので、入門書を終えて次に何やっていいか分からない人に最適? 計算量(時間/空間)の感覚が身につく デバッグ力があがる 他人のソースコードを読む力が付く テストケースを考えられる(コーナーケースが考えられるようになる) 何より楽しい
  • 9. 主な競技プログラミング大会 / サイト TopCoder    ○ Codeforces     ○ Google Code Jam    ○ AOJ (会津大学オンラインジャッジ) ACM/ICPC ( ACM 国際大学対抗プログラミングコンテスト) ○ が付いているサイトについて(練習モードで)実演
  • 10. TopCoder http://community.topcoder.com/tc 競技プログラミングと言えばまずはここ コンテストは複数種開催されているが競技プログラミングとしては SRM(Short Round Match) が基本。月 3 回程度。 レーティング有り。 Div1 (1200 以上 ) / Div2 に分かれていて問題が違う 3問 95 分 / 問題によって最大得点が異なる 典型的には 250, 500, 1000 時間に応じて得られる得点が減少していく Coding 75 分->休憩 5 分-> Challenge 15 分 2 秒、 64MB 制限 正誤判定(システムテスト)は競技時間終了後 形式 アクティブ: 8,600 人 1SRM 2,000 人強制限 参加者数 C/C++, C#, Java, VB 使用可能言語 Java 使用による独自 UI システム
  • 11. Codeforces http://www.codeforces.com/ 比較的最近できたロシアの競技プログラミングサイト。月 4 回くらい。 以前はよく落ちたりしていたが最近はシステムは安定している 英語が読みにくいと言われることが多い Gmail 、 OpenID でログイン可能 レーティング有り。 Div1 (1650 以上 ) / Div2 があるが一括開催だったり片方のみ開催だったり色々 5 問 120 分 / 最大得点が異なり時間に応じて減少 Challenge に相当する Hack が可能だが 時間枠が分かれていない 実行時間、メモリ制約は問題毎に明示 正誤判定(システムテスト)は競技時間終了後 形式 7,900 人 1Round 1,500 人強 参加者数 Pascal, C, C++, C++0x, C#, Java, PHP, Python, Ruby, Haskell 使用可能言語 Web (Web2.0 による競技 PG サイトを標榜 ) システム
  • 12. Google Code Jam http://code.google.com/codejam/ Google が開催している年に 1 度のお祭り 決勝はオンサイトでやる 勝ち抜き制 予選+ 4 回くらい?予選は 24 時間 各問題に対し、データ量等が少ない small input と 多い large input がある 提出に時間制限あり( small 4 分 / large 8 分) 問題、 small or large で得点が異なる small input は即結果判定有りで、時間中に複数回提出可能 large input は一発勝負で結果は競技時間終了後判明 得点と、正答累積時間+ 4 分 × (正答迄の)誤答数で順位付け 形式 13,000 人 (2011 予選提出者 ) 参加者数 自由 使用可能言語 Web (ローカルで実行した結果を提出) システム
  • 13. AOJ(会津大学オンラインジャッジ) http://judge.u-aizu.ac.jp/onlinejudge/ 日本にあるオンラインジャッジ オンラインジャッジ: 用意された過去問等に対してソースを送信すると自動で正誤を判定してくれるサイト 黙々と練習するのに良い 3,700 人 参加者数 C, C++, Java 使用可能言語 Web システム
  • 14. ACM/ICPC (ACM 国際大学対抗プログラミングコンテスト ) http://cm.baylor.edu/welcome.icpc http://icpc2011.ait.kyushu-u.ac.jp/ja/home ACM( アメリカ計算機学会 ) 主催のプログラミングコンテスト 大学生対象 チーム制 で 1 チーム 3 人、 1PC 共用 基本オンサイト 国内予選->アジア予選->決勝 4,5 時間 7 ~ 10 問程度 正答数と、正答累積時間+ 20 分 ×( 正答迄の ) 誤答数で順位付け 電子的な事前準備禁止 形式 88 カ国、 2,070 大学、 8,305 チーム (2010) 参加者数 C, C++, Java 使用可能言語 国内予選は Web システム
  • 15. 実演 TopCoder アカウント登録 SRM 登録 SRM( 今回は Practice) Codeforces Round 登録 Round( 今回は Practice) Google Code Jam Practice
  • 16. TopCoder 実演 アカウント登録 http://community.topcoder.com/tc Register Now->on TopCoder-> 頑張って入力->メール受信-> URL ref. http://mainly-coding.blogspot.com/2010/02/topcoder.html SRM 登録 (SRM 開始 3 時間前から ) (Java 実行環境インストール ) http://community.topcoder.com/tc Competitions->Algorithm->Single Round Matches (SRM)->Launch Arena Active Contests-> どれか-> Register SRM Launch Arena まで↑と一緒 実際には Active Contests -> Enter Practice は Practice Rooms->SRMs-> どれか Challenge は Summary からダブルクリック Practice での System Test は Practice Options -> Run System Test
  • 17. Codeforces 実演 設定 http://www.codeforces.com/contests 右上の Enter からログイン Settings -> Social の Country に入れておくと国別ランキングに集計 ※ CF / TC 日本参加者比較表 http://yak2.myhome.cx/misc/cfjp.html Round 登録 (Round 開始 24 時間前から ) ログインまで↑と同じ Register Round ログインまで↑と同じ Enter ( 実際には時間になると勝手に Enter 伺いが出る ) Practice は 適当な Round の Enter -> Register for Practice Hack は Room からセルをダブルクリック (Practice 不可 ) Hack するためには Lock が必要 Hack されても Lock していなければ再提出が可能
  • 18. Codeforces の問題状態遷移 Pretest Passed Pretest Failed 初期状態 Hacked System Test の壁 Passed System Test Locked Failed System Test After lock hacked 再提出成功 ハックされる 提出成功 提出失敗 再提出 成功 システムテスト通過 システムテスト通過 ならず ロック ハックされる
  • 19. Google Code Jam 実演 事前登録 http:// code.google.com/codejam / 実際には Practice のところで登録が必要 Practice Input ファイルをダウンロードして実行、出力を提出 CUI ツールもできたが未使用なので説明できない 実際には時間制限あり Short input はリトライ可能、 Large input はリトライ不可
  • 20. 書籍?コミュニティ プログラミングコンテストチャレンジブック 通称:蟻本 ISBN978-4-8399-3199-5 ,280+ 税 秋葉拓哉 (@iwiwi) ?岩田陽一 (@wata_orz) ? 北川宜稔 (@kita_masa) TopCoder 部 http://topcoder.g.hatena.ne.jp/ Twitter 今すぐフォローすべき競技プログラミング界のスーパーエンジニア http://d.hatena.ne.jp/chokudai/20110617/1308242031 ニコニコ生放送 LayCurse(@laycrs) 、診断人 (@nico_shindannin)
  • 21. 用語集 レーティングが赤い人。殿上人。 Red Coder 深さ優先探索 Depth-first search DFS 幅優先探索 Breadth-first search BFS チャット等で良くある挨拶 Good Luck & Have Fun GL & HF 出題者による問題の解説 Editorial 実行時エラー Runtime Error RE 意味 原語 用語 誤答 Wrong Answer WA チャット等で良くある挨拶 Dynamic Programming DP メモリ制限超過 Memory Limit Exceeded MLE 実行時間超過 Time Limit Exceeded TLE 出力形式エラー Presentation Error PE 正解 ACcepted AC