Submit Search
初めてのプロコン
0 likes
1,431 views
HCPC: 北海道大学競技プログラミングサークル
初めてのプロコン
Technology
Read more
1 of 24
Download now
Download to read offline
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
More Related Content
PPTX
Introduction to programming
HCPC: 北海道大学競技プログラミングサークル
PDF
CODE FESTIVAL 2015 沖縄ツアー 解説
AtCoder Inc.
PPTX
2011 02-21 第1回@freaks勉強会
YuichiroMukai
PDF
DP特集
Dai Hamada
PDF
蟻本輪講 データ構造
HCPC: 北海道大学競技プログラミングサークル
PDF
直前合宿 講義スライド
tozan gezan
PDF
定番アルゴリズムを徹底理解!
teapipin
PDF
動的計画法
HCPC: 北海道大学競技プログラミングサークル
Introduction to programming
HCPC: 北海道大学競技プログラミングサークル
CODE FESTIVAL 2015 沖縄ツアー 解説
AtCoder Inc.
2011 02-21 第1回@freaks勉強会
YuichiroMukai
DP特集
Dai Hamada
蟻本輪講 データ構造
HCPC: 北海道大学競技プログラミングサークル
直前合宿 講義スライド
tozan gezan
定番アルゴリズムを徹底理解!
teapipin
動的計画法
HCPC: 北海道大学競技プログラミングサークル
Viewers also liked
(8)
PDF
ダイクストラ法
ohsofty
PDF
目指せグラフマスター
HCPC: 北海道大学競技プログラミングサークル
PDF
グラフを扱おう:最短路問題
HCPC: 北海道大学競技プログラミングサークル
PDF
AtCoder Beginner Contest 035 解説
AtCoder Inc.
PDF
大規模グラフアルゴリズムの最先端
Takuya Akiba
PDF
Learning Convolutional Neural Networks for Graphs
Takuya Akiba
PPTX
AtCoder Beginner Contest 034 解説
AtCoder Inc.
PDF
AtCoder Beginner Contest 033 解説
AtCoder Inc.
ダイクストラ法
ohsofty
目指せグラフマスター
HCPC: 北海道大学競技プログラミングサークル
グラフを扱おう:最短路問題
HCPC: 北海道大学競技プログラミングサークル
AtCoder Beginner Contest 035 解説
AtCoder Inc.
大規模グラフアルゴリズムの最先端
Takuya Akiba
Learning Convolutional Neural Networks for Graphs
Takuya Akiba
AtCoder Beginner Contest 034 解説
AtCoder Inc.
AtCoder Beginner Contest 033 解説
AtCoder Inc.
Ad
More from HCPC: 北海道大学競技プログラミングサークル
(20)
PDF
写像 12 相
HCPC: 北海道大学競技プログラミングサークル
PDF
ACPC 2017 Day3 F: 掛け算は楽しい
HCPC: 北海道大学競技プログラミングサークル
PDF
ACPC 2017 Day3 D: 優柔不断
HCPC: 北海道大学競技プログラミングサークル
PDF
ACPC 2019 Day3 G: Restricted DFS
HCPC: 北海道大学競技プログラミングサークル
PDF
ACPC 2019 Day3 F: 部分文字列分解
HCPC: 北海道大学競技プログラミングサークル
PDF
ACPC 2019 Day3 E: 総和の切り取り
HCPC: 北海道大学競技プログラミングサークル
PDF
ACPC 2019 Day3 B: パフェ
HCPC: 北海道大学競技プログラミングサークル
PDF
ACPC 2019 Day3 A: 間違い探し
HCPC: 北海道大学競技プログラミングサークル
PDF
HUPC 2019 Day2 G: 木
HCPC: 北海道大学競技プログラミングサークル
PDF
HUPC 2019 Day2 E: ジャム
HCPC: 北海道大学競技プログラミングサークル
PDF
HUPC 2019 Day2 H: Revenge of UMG
HCPC: 北海道大学競技プログラミングサークル
PDF
HUPC 2019 Day2 F: MOD Rush
HCPC: 北海道大学競技プログラミングサークル
PDF
HUPC 2019 Day2 C: 串刺し
HCPC: 北海道大学競技プログラミングサークル
PDF
HUPC 2019 Day1 F: グリッドの番号
HCPC: 北海道大学競技プログラミングサークル
PDF
HUPC 2019 Day1 E: 最短経路の復元
HCPC: 北海道大学競技プログラミングサークル
PDF
HUPC 2019 Day1 D: 貪欲が最適?
HCPC: 北海道大学競技プログラミングサークル
PDF
HUPC 2019 Day1 C: 短絡評価
HCPC: 北海道大学競技プログラミングサークル
PDF
HUPC 2019 Day1 B: 自身の 2 倍
HCPC: 北海道大学競技プログラミングサークル
PDF
HUPC 2019 Day1 A: four tea
HCPC: 北海道大学競技プログラミングサークル
PDF
Convex Hull Trick
HCPC: 北海道大学競技プログラミングサークル
写像 12 相
HCPC: 北海道大学競技プログラミングサークル
ACPC 2017 Day3 F: 掛け算は楽しい
HCPC: 北海道大学競技プログラミングサークル
ACPC 2017 Day3 D: 優柔不断
HCPC: 北海道大学競技プログラミングサークル
ACPC 2019 Day3 G: Restricted DFS
HCPC: 北海道大学競技プログラミングサークル
ACPC 2019 Day3 F: 部分文字列分解
HCPC: 北海道大学競技プログラミングサークル
ACPC 2019 Day3 E: 総和の切り取り
HCPC: 北海道大学競技プログラミングサークル
ACPC 2019 Day3 B: パフェ
HCPC: 北海道大学競技プログラミングサークル
ACPC 2019 Day3 A: 間違い探し
HCPC: 北海道大学競技プログラミングサークル
HUPC 2019 Day2 G: 木
HCPC: 北海道大学競技プログラミングサークル
HUPC 2019 Day2 E: ジャム
HCPC: 北海道大学競技プログラミングサークル
HUPC 2019 Day2 H: Revenge of UMG
HCPC: 北海道大学競技プログラミングサークル
HUPC 2019 Day2 F: MOD Rush
HCPC: 北海道大学競技プログラミングサークル
HUPC 2019 Day2 C: 串刺し
HCPC: 北海道大学競技プログラミングサークル
HUPC 2019 Day1 F: グリッドの番号
HCPC: 北海道大学競技プログラミングサークル
HUPC 2019 Day1 E: 最短経路の復元
HCPC: 北海道大学競技プログラミングサークル
HUPC 2019 Day1 D: 貪欲が最適?
HCPC: 北海道大学競技プログラミングサークル
HUPC 2019 Day1 C: 短絡評価
HCPC: 北海道大学競技プログラミングサークル
HUPC 2019 Day1 B: 自身の 2 倍
HCPC: 北海道大学競技プログラミングサークル
HUPC 2019 Day1 A: four tea
HCPC: 北海道大学競技プログラミングサークル
Convex Hull Trick
HCPC: 北海道大学競技プログラミングサークル
Ad
初めてのプロコン
1.
プログラミングコンテスト入門 アルゴリズム研究室 井上祐馬
2.
プログラミングコンテストとは? • 複数の問題が与えられる • 制限時間内に与えられた問題をできるだけ多く解く •
「問題を解く」とは、「問題を解くプログラムを作成する」 ことである
3.
問題例:ガソリンスタンド • ガソリンスタンドを経由して車で目的地へ • 1ℓで1km進める。各地で一定量のガソリンが補給可能 •
最小何回の補給で目的地へ辿り着けるか? 2ℓ 5ℓ 3ℓ 8ℓ 10ℓ 4km 4km 2km 5km 2km 6km 初期:10ℓ
4.
問題文の構成 問題背景 入力形式 出力形式 サンプル出力 サンプル入力
5.
例:問題文 • あなたは出発地点からLkm離れた到着地点に車で向 かいたい。 • 1km進むためには1ℓのガソリンを消費する。 •
出発時点であなたはPℓのガソリンを持っている。 • 途中でガソリンが0になってしまうと、移動できなくなる。 • ただし、道中N箇所あるガソリンスタンドに立ち寄れる。 • i番目のガソリンスタンドは出発地点から𝑎𝑖kmの地点に 存在し、そこでは𝑏𝑖ℓのガソリンを補給できる。 • 車は無限にガソリンを積めるとすると、到着地点に到 達可能か?可能ならば、最小の補給回数を求めよ。
6.
入力形式 • N • 𝑎1
𝑏1 • 𝑎2 𝑏2 • … • 𝑎 𝑁 𝑏 𝑁 • L P • 1≦N≦10000 • 1≦L≦1000000, 1≦P≦1000000 • 1≦ 𝑎𝑖 < L, 1≦𝑏𝑖≦100
7.
出力形式 • 到着地点に到達できないなら、-1を • 到達できるなら、最小の補給回数を •
一行で出力せよ
8.
サンプル Input: 4 4 4 5 2 5
2 11 5 15 10 25 10 Output: 2
9.
コンテストの流れ 問題理解 アルゴリズム 考察 実装 サンプルテスト 自前テスト 提出
AC
10.
問題解釈 • 問題を正しく理解する • 記述が複雑だったり、英語だったり、斜め読みしたりすると誤 読がしばしば起きる •
誤読している問題は(奇跡的偶然がない限り)永遠に解けない • 問題を正しく理解できているかを確かめるためには • 改めて読み直して、読み落とし・勘違いがないか確かめる • サンプルを手で解いてみる • チーム戦なら、チームメイトにも読んでもらい、内容を確認し 合う
11.
アルゴリズム考察 • 問題を解く手順(=アルゴリズム)を考える • プログラミングコンテストで最も重要と言ってもよいフェイズ •
問題から導ける事実をかき集める • 「現在のガソリン<次のGSへの距離」なら進めない • 使うGSが予め決まっていれば、到達できるか判定できる • 「GSを訪れる=以降そのGSで補給する権利を得る」 etc… • 事実に基づいてアルゴリズムを設計する • 「GSが決まれば到達判定可能⇒GSの決め方を全部試す」など • アルゴリズムに必要な情報を求めるためにサブ問題を解くことも しばしばある
12.
アルゴリズム考察 • 計算量の見積もりは大事 • ICPCは明確な実行時間制限はないが、さすがに3時間で終 わらないプログラムは論外 •
O-記法(オーダー記法)を用いて評価することが多い • 計算回数をデータの大きさの関数として概算する • 例えば、n個から3つ選んだ和を求めるとき3重ループで計算した場合、 𝑛(𝑛−1)(𝑛−2) 6 回の足し算を行う。これを大まかに見積もってO(𝑛3)と書く • O()の中身が最大になるように制約の数値を入れてみる • 例えば、1≦n≦100のとき、O (𝑛3)はO(1000000) = O(106) • 大まかに、 O(107~108)程度で1秒ほどかかる • これを大きく越えるときは、アルゴリズムを見直す
13.
アルゴリズム考察 アルゴリズム考察 問題の特徴を 分析 既存のアルゴリ ズムへ帰着 アルゴリズムに 必要な情報を 得る問題を解く 問題の特徴を 分析 既存のアルゴリ ズムへ帰着計算量・正当性 の検討 計算量・正当性 の検討
14.
アルゴリズム考察(問題の例) アルゴリズム考察 GSを訪れる = 以降いつでもその GSで補給可能 貪欲法: 先に進めないとき、今まで 訪れた中で最大補給 できるGSで補給 N個の中の 最大値を高速に 求めたい O( 𝑁)以下で 最大値を 求めればよい 優先順位付き キュー ・証明可能(証明略) ・O(N)回、最大のGS を求める ・ヒープで実装可 ・O(log
N)
15.
実装 • アルゴリズムをきちんと考察できていれば、あとはその アルゴリズムを実装するだけ • アルゴリズムの設計をきちんとしよう •
とはいえ、複雑な部分も多い • 頻出テクニックを身につけておく • STLなど、標準で使えるものを最大限活用する • 自作のライブラリ等によく使うアルゴリズムをまとめる • これらは、バグを減らす意味でも役立つ
16.
実装(入力) int n,L,P; int a[10000],b[10000]; cin
>> n; for(int i=0;i<n;i++)cin >> a[i] >> b[i]; cin >> L >> P;
17.
実装(アルゴリズム) dis[0] = a[0]; for(int
i=1;i<n;i++)dis[i] = a[i] – a[i-1]; dis[n] = L – a[n-1]; int curGas = P, res = 0; priority_queue<int> q; for(int i=0;i<=n;i++){ while(curGas < dis[i]){ if(q.empty())return -1; curGas += q.top(); q.pop(); res++; } q.push(b[i]); } return res; dis[i]にi番目の地点から 次の地点への距離を記録 curGas:現在の残りガソリン, res:答えをメモ 優先順位付きキュー(C++ STLにある) 次の地点への移動に必要なだけ補給 使えるGSがもうなかったら到達不可 最大値が常にtopに来ている 補給したので回数を1増やす 今いるGSをこれ以降使えるようにする 最後まで到達できたら、補給回数を返す
18.
テスト • どんな優秀なプログラマでも、バグは埋め込んでしまう もの • テストは必ず行いましょう •
まずはサンプルが正しく動くか確かめる • サンプルだけでは試せないやばそうなケースを自分で作って 確かめてみる • 最大ケース、最小ケース • グラフ:負の辺、ループ、多重辺 • 計算:0や負の値、オーバーフロー • 幾何:図形が接している etc… • どんなケースがやばそうか、は経験が大事 • 一度したミスはチェックシートなどにまとめるとよいかも
19.
テストで失敗したら 問題理解 アルゴリズム 考察 実装 サンプルテスト 自前テスト 提出 AC WA,TLE, etc… 失敗したケースを手で 解いたらサンプルと合わない :いい感じ
:つらぽよ
20.
テストで失敗したら 問題理解 アルゴリズム 考察 実装 サンプルテスト 自前テスト 提出 AC WA,TLE, etc… 失敗したケースの挙動が 想定と異なる :いい感じ
:つらぽよ
21.
テストで失敗したら 問題理解 アルゴリズム 考察 実装 サンプルテスト 自前テスト 提出 AC WA,TLE, etc… 実装してみると計算量の 見積もりに穴があった :いい感じ
:つらぽよ
22.
失敗したら 問題理解 諦め アルゴリズム 考察 実装 サンプルテスト 自前テスト 提出 AC WA,TLE, etc… :いい感じ
:つらぽよ
23.
コンテストの流れ • 「諦め」はネタではない! • 解ける問題から解く、解けないときは他の問題も目を通そう •
他に解く問題がないときは諦めてはいけない。 • 問題が解けないのはたいていこんなとき • 問題解釈がそもそも間違っている • アルゴリズムが間違っている • 出力が正しくない • 計算量の見積もりに誤りがある • 実装がバグっている • オーバーフローしている • 解法(アルゴリズム)が思いつかない
24.
まとめ • プログラミングコンテストは・・・ • 問題を読んで特徴を分析し、 •
十分に効率的なアルゴリズムを考え、 • それを実装するコンテスト • よい成績を残すために必要なものは・・・ • アルゴリズムやデータ構造の知識 • 必要な情報をピックアップしたり導くための分析、柔軟な思考 • 頻出な実装ポイントの経験やテクニック • デバッグの勘 • 解ける問題の選定
Download