More Related Content
PDF
AtCoder Beginner Contest 016 解説 PDF
AtCoder Regular Contest 039 解説 PDF
AtCoder Regular Contest 021 解説 PDF
AtCoder Regular Contest 035 解説 PDF
PDF
AtCoder Beginner Contest 022 解説 PDF
PPTX
AtCoder Beginner Contest 012 解説 What's hot
PDF
AtCoder Regular Contest 033 解説 PDF
PDF
AtCoder Beginner Contest 024 解説 PDF
AtCoder Beginner Contest 023 解説 PDF
PDF
AtCoder Beginner Contest 008 解説 PDF
AtCoder Beginner Contest 020 解説 PDF
AtCoder Regular Contest 031 解説 PDF
PDF
AtCoder Beginner Contest 017 解説 PPTX
PDF
AtCoder Beginner Contest 025 解説 PDF
AtCoder Beginner Contest 035 解説 PDF
AtCoder Regular Contest 032 解説 PDF
AtCoder Beginner Contest 026 解説 PDF
AtCoder Beginner Contest 021 解説 PDF
AtCoder Beginner Contest 018 解説 PDF
AtCoder Beginner Contest 007 解説 PDF
AtCoder Regular Contest 042 解説 PDF
AtCoder Regular Contest 043 解説 Similar to CODE FESTIVAL 予選B 解説
PDF
PDF
AtCoder Beginner Contest 011 解説 PDF
AtCoder Beginner Contest 030 解説 PDF
CODE THANKS FESTIVAL 2014 A日程 解説 PDF
PDF
AtCoder Beginner Contest 006 解説 PDF
CODE THANKS FESTIVAL 2014 B日程 解説 PDF
PDF
AtCoder Beginner Contest 010 解説 PPTX
AtCoder Beginner Contest 034 解説 PDF
PDF
AtCoder Regular Contest 027 解説 PDF
AtCoder Regular Contest 017 PDF
PDF
PDF
AtCoder Regular Contest 026 解説 PDF
AtCoder Regular Contest 046 PDF
AtCoder Beginner Contest 015 解説 PDF
AtCoder Beginner Contest 019 解説 PDF
More from AtCoder Inc.
PPTX
PPTX
PDF
PDF
Disco Presents ディスカバリーチャンネルプログラミングコンテスト2016 本選 解説 PDF
PDF
AtCoder Regular Contest 049 解説 PDF
AtCoder Regular Contest 048 PDF
PDF
AtCoder Beginner Contest 033 解説 PDF
PDF
PDF
CODE FESTIVAL 2015 沖縄ツアー 解説 PDF
PDF
CODE FESTIVAL 2015 予選B 解説 PDF
AtCoder Regular Contest 045 解説 PDF
CODE FESTIVAL 2015 予選A 解説 PDF
AtCoder Beginner Contest 029 解説 PDF
AtCoder Regular Contest 044 解説 PDF
AtCoder Beginner Contest 028 解説 PDF
天下一プログラマーコンテスト2015 予選B 解説 CODE FESTIVAL 予選B 解説
- 1.
- 2.
- 3.
A問題
• 問題概要
– 2つの整数A,Bが与えられる。
– 大きい方を出力してください。
• 解説
– 比較演算子とif文を使って場合分けする
– 諸言語で予め実装されているmax関数等を使う
2014/10/26 3
- 4.
- 5.
B問題問題概要
• 要素数Nの数列Aが与えられる。
• A[ 1]~A[i]の総和がKを超える最小のiを求めよ。
• 制約
– 1 ≦ N ≦ 100,000
– 1 ≦ A[i] ≦ 100,000
– 1 ≦ K ≦ 1,000,000,000
2014/10/26 5
- 6.
- 7.
- 8.
C問題問題概要
• 2N(Nは整数) 文字の文字列S1, S2,S3がある
• S1の半分とS2の半分を取ってきて並び替えることで
S3が構成可能か判断せよ。
• 制約
– 2 ≦ 2 N ≦ 100,000
– S1,S2,S3は大文字アルファベットのみから構成される
2014/10/26 8
- 9.
C問題アルゴリズム
• 構成する際に並び替えることができるので、S1,S2,S3
の文字列の順番は答えに影響しない
– 各アルファベットを何個ずつ含むかだけが必要
• まずはN文字ずつ取り出すという制約を無視する
– 取り出し方をアルファベットごとに独立して考えることが出
来る
– 例えば「'A'をS1から何個取り出すか」と「'B'をS1から何個
取り出すか」は全く影響しあわない
2014/10/26 9
- 10.
C問題アルゴリズム
• 各アルファベットについてS1から取り出すことが出
来る文字数の範囲を求める
• S1から取り出す文字数が少なすぎると、S2から取り
出す文字数にかかわらず、S3を構成するのに足り
なくなる
– 例:S1='AABB' S2='AAAB' S3='ABBB'のときS1から' B 'を
1つしか取り出さないとすると、S3を構成できなくなる
2014/10/26 10
- 11.
C問題アルゴリズム
• 各アルファベットについてS1から取り出すことが出
来る文字数の範囲を求める
• S1から取り出す文字数が多すぎると、S2から取り出
す文字数にかかわらず、S3を構成するのに余ってし
まう
– 例:S1=‘AAAB’ S2=‘AABB’ S3=‘ABBB’のときS1から
‘ A’を3つも取り出すとすると、S3を構成するのに余って
しまう
2014/10/26 11
- 12.
- 13.
C問題アルゴリズム
• 各アルファベットについてこの範囲をもとめて、うまく
総和がN/2にすることが出来るか判断すれば良い
• できるだけ少なくS1から取り出した時の文字数と、で
きるだけ多くS1から取り出した時の文字数の間に
N/2があるかどうか判断する。
– それぞれさきほどのmax(0,. C3-C2) ~ min(C1, C3) の
総和を取れば求めることが出来る
2014/10/26 13
- 14.
- 15.
D問題問題概要
• 要素数Nの数列Aが与えられる。
• 各i( 1≦i≦N)に対してiとjの間の全てのk( jも含む)に
ついてA[k]≦ A[ i]であるようなjの個数を求めよ。
• 制約
– 1≦N≦ 100,000
– 1≦A[i]≦100,000
2014/10/26 15
- 16.
- 17.
- 18.
- 19.
D問題アルゴリズム
• 山小屋iから見える範囲
• これはiを含むある区間である
• iに一番近いh[i]より高い山小屋が両端となる
• 両端をどう求めるか?
– 全探索
– DP
– stackをつかう
– 二分探索
2014/10/26 19
- 20.
D問題アルゴリズム
• 山小屋iから見える範囲
• これはiを含むある区間である
• iに一番近いh[i]より高い山小屋が両端となる
• 両端をどう求めるか?
– 全探索
– DP
– stackをつかう
– 二分探索
2014/10/26 20
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
D問題アルゴリズム
• 山小屋iから見える範囲
• これはiを含むある区間である
• iに一番近いh[i]より高い山小屋が両端となる
• 両端をどう求めるか?
– 全探索
– DP
– stackをつかう
– 二分探索
2014/10/26 29
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
- 53.
D問題アルゴリズム
• dp[i]= dp[dp[i]]という操作を最悪でO(N)回するので
総計算量はO(N^2)?
– 実はO(N)
• dp[i] = dp[dp[i]]という操作(先ほどの例では黒い矢
印をたどること)は各矢印についてたかだか1回しか
行われない
– 矢印はO(N)個しかないので総計算量はO(N)
• 満点が得られる
2014/10/26 53
- 54.
D問題アルゴリズム
• dp[i]= dp[dp[i]]という操作を最悪でO(N)回するので
総計算量はO(N^2)?
– 実はO(N)
• dp[i] = dp[dp[i]]という操作(先ほどの例では黒い矢
印をたどること)は各矢印についてたかだか1回しか
行われない
– 矢印はO(N)個しかないので総計算量はO(N)
• 満点が得られる
2014/10/26 54
- 55.
D問題アルゴリズム
• 山小屋iから見える範囲
• これはiを含むある区間である
• iに一番近いh[i]より高い山小屋が両端となる
• 両端をどう求めるか?
– 全探索
– DP
– stackをつかう
– 二分探索
2014/10/26 55
- 56.
D問題アルゴリズム
• stackを用意する
• 東から順番に
– h[i] がh[ stackの先頭]より大きい限りstackの先頭をpop
し続ける
– dp[ i] = stackの先頭
– iをstackの先頭にpushする
• というふうにやると先ほどと同じdp[i]が得られる
• 実質やっていることはDP解と同じ
– こちらのほうがO(N)であることがわかりやすい
2014/10/26 56
- 57.
D問題アルゴリズム
• 山小屋iから見える範囲
• これはiを含むある区間である
• iに一番近いh[i]より高い山小屋が両端となる
• 両端をどう求めるか?
– 全探索
– DP
– stackをつかう
– 二分探索
2014/10/26 57
- 58.
- 59.
- 60.
- 61.
- 62.
- 63.
- 64.
- 65.
- 66.
- 67.
- 68.
- 69.
- 70.
- 71.
D問題アルゴリズム
• この解法を思いつく人が一番多いと予想される
• しかし、挿入と探索が効率的にできるデータ構造を
実装するのはコンテスト時間内では慣れていないと
難しい
– set等が予め用意されていない言語だと、この解法は実装
しづらい
– そういう時は先程のDPやstackを使った解法を実装すれ
ば良い
2014/10/26 71