SlideShare a Scribd company logo
1 of 28
Download to read offline
AtCoder Regular Contest 027
解説
2014/8/2 1
A 問題 – 門限
問題概要
• 現在の時間 ℎ と分 𝑚 が与えられる。
• 後何分で 18 時 0 分かを求める。
• 0 ≦ ℎ ≦ 17 , 0 ≦ 𝑚 ≦ 59
※標準的な入出力については、ABC004 の解説等を参照してください。
解法その 1
• 18 時まであと何時間何分かを求めて、その後分に変換する。
• 現在時刻が ℎ 時 𝑚 分なら、
・ 𝑚 = 0 ⇒ あと 18 − ℎ 時間
・ 𝑚 ≠ 0 ⇒ あと 17 − ℎ 時間と 60 − 𝑚 分
• 計算結果を 𝑎 時間 𝑏 分とすると、 a × 60 + 𝑏 分が答え。
• 最初に、現在時刻を 0 時ちょうどからの経過分数に変換して、1080
から引いても良い。
解法その 2
• 現在時刻から、1 分後、2 分後、…と 1 分ずつ加算して、18 時ちょうど
になるまでに合計何回足したかを数える。
• どちらの方針にするかは、実装時間やバグの入りやすさなどを考慮
して選択 (個人差あり)。
B 問題 –
大事な数なのでZ 回書きまLた。
問題概要
• 0 から 9 までと、大文字アルファベットのみで構成された長さ 𝑁 の文
字列が 2 個与えられる。
• 大文字アルファベットを 0 から 9 までの整数に変換する処理を行っ
た結果、両者が表す整数が一致した。
• 一致した整数として全部で何通り考えられるかを求めよ。
• 1 ≦ 𝑁 ≦ 18
部分点解法
• 答えとなる数字を全探索する。
• この場合、答えとして考えられないものは、
・同じアルファベットに複数の数字が割り当てられている。
・先頭に 0 が来ている。
となる場合なので、その場合を判定して、残ったものの総数が答えと
なる。
満点解法
• 部分点解法では、計算量が O(10 𝑁) となるので、𝑁が大きい場合に
は時間が掛かり過ぎる。
• 一致しているという条件をうまく言い換えたい。
• ここでは、「グラフ」の概念を導入すると理解しやすくなる。
• それぞれの文字を頂点としたグラフを考える。
• 同じ数字でなければならない文字同士を辺で結ぶ。
• 同じ数字でなければならない文字同士というのは、同じ桁 (同じ位)
にある文字同士のことである。(例えば、2 つの文字列がABCDとEFEH
だった場合は、AE,BF,CE,DH 間に辺を結ぶ。)
満点解法
• 数字と文字が同じ桁にある場合は、その文字に、「その数字でなければな
らない」という条件を付加する。
• 最上位にある文字については、さらに「0以外」という条件も。
• なお、この条件は衝突しない(衝突したら答えがなくなるため)。
• その後、各連結成分(辺同士で行き来できる頂点たち)について、
・数字が割り当てられている⇒1 通り
・数字が割り当てられていない、かつ最上位⇒9 通り
・数字が割り当てられていない、かつ最上位でない⇒10 通り
をそれぞれ掛け合わせると答え。
例(入力例 3 – PRBLMB と ARC027)
• 文字を頂点としたグラフを考える。
P
R
A
C
B L
M
例(入力例 3 – PRBLMB と ARC027)
• 文字を頂点としたグラフを考える。
• 同じ数字になるもの同士を辺で結ぶ(PA,BC)。
P
R
A
C
B L
M
例(入力例 3 – PRBLMB と ARC027)
• 文字を頂点としたグラフを考える。
• 同じ数字になるもの同士を辺で結ぶ(PA,BC)。
• 文字と数字の割り当てを反映させる(L=0,M=2,B=7)。
P
R
A
C
B L
M
0
27
例(入力例 3 – PRBLMB と ARC027)
• 文字を頂点としたグラフを考える。
• 同じ数字になるもの同士を辺で結ぶ(PA,BC)。
• 文字と数字の割り当てを反映させる(L=0,M=2,B=7)。
• 最上位の情報も付ける。
P
R
A
C
B L
M
0
27最上位
例(入力例 3 – PRBLMB と ARC027)
• 文字を頂点としたグラフを考える。
• 同じ数字になるもの同士を辺で結ぶ(PA,BC)。
• 文字と数字の割り当てを反映させる(L=0,M=2,B=7)。
• 最上位の情報も付ける。
P
R
A
C
B L
M
0
27最上位
9 通り × 10通り × 1 通り× 1 通り× 1 通り = 90 通り
補足
• グラフの連結判定には、union-find を利用すると効率的 & 実装しや
すい。
• サイズが小さいので探索をしても良いが、union-find を知っていると
色々と便利なので、ぜひとも覚えておこう!
• 前回(ARC026)の解説にも載っているので、参考にしてください。
• http://www.slideshare.net/chokudai/arc026
C 問題 –
最高のトッピングにしような
問題概要
• スペシャルチケット 𝑋 枚と通常のチケット 𝑌 枚を持っている。
• 𝑁 個のトッピングがあり、トッピング 𝑖 は 𝑡𝑖 枚のチケット(うち 1 枚以
上はスペシャルチケット) と交換でき、嬉しさは ℎ𝑖 である。
• 同じトッピングは複数回入手できない。
• 嬉しさの合計値として最大なものを求めよ。
• 1 ≦ 𝑋 ≦ 300 , 0 ≦ 𝑌 ≦ 300, 1 ≦ 𝑁 ≦ 300
• 1 ≦ 𝑡𝑖 ≦ 600, 1 ≦ ℎ𝑖 ≦ 5,000,000
部分点解法
• この問題はナップサック問題の一種。
• 動的計画法を用いると効率的に解答することができる。
• dp[i][j][k] = (現在トッピング i まで処理しており、すでにスペシャルチ
ケットを j 枚、通常のチケットを k 枚消費している場合での嬉しさの
合計値の最大値) とすると、
dp[i][j][k] = max{dp[i-1][j][k] ,
dp[i-1][j-m][k- t_i +m] + h_i (1 ≦ m ≦ t_i)}
(細かい境界条件は割愛)
• O(𝑋𝑌𝑁(𝑋 + 𝑌)) となる。
満点解法
• 先ほどの場合、交換可能なすべての組み合わせを試していたが、出
来る限りスペシャルチケットの消費数を抑えられるものを選んだほう
がいいのでは?
• 実際、消費枚数が最も少ない (m が最小) となるもののみを考慮して
も最適解を得られる。
• 実はこの問題は、「チケットを 𝑋 + 𝑌 枚持っており、トッピングは最大
𝑋 個しか選べない場合の最大化」と同じ問題。
• dp[i][j][k] = (現在トッピング i まで処理しており、トッピングを j 個採用
しており、チケットを k 枚消費している場合での嬉しさの合計値の最
大値) とおく動的計画法なら O(𝑋𝑁(𝑋 + 𝑌)) となる。
D 問題 –
ぴょんぴょんトレーニング
問題概要
• 𝑁 個の石があり、石 𝑖 からは ℎ𝑖 個先まで跳べる。
• 石 𝑠𝑖 から石 𝑡𝑖 までジャンプで移動する組み合わせが何個あるか、と
いうクエリを 𝐷 個解け。
• 同じトッピングは複数回入手できない。
• 嬉しさの合計値として最大なものを求めよ。
• 1 ≦ 𝑁 ≦ 300,000 , 1 ≦ 𝐷 ≦ 5,000, 1 ≦ ℎ𝑖 ≦ 10
• 1 ≦ 𝑠𝑖 <𝑡𝑖 ≦ 𝑁
部分点解法
• この問題も動的計画法によって計算できる。
• dp[i]=(石 i までの行き方) とおくと、
dp[i] = (dp[i − j] ∗ 𝑓(i − j, i)10
j=1 )
ここで、𝑓 𝑥, 𝑦 は𝑥 + ℎ 𝑥 ≧ 𝑦なら 1 、そうでないなら 0 を取る関数とす
る。
• 手前 10 項 (dp[i-1],dp[i-2],…,dp[i-10])を覚えておけば良い。
• 毎回 O(𝑁) で計算すれば O(𝑁𝐷) となる。
満点解法
• 毎回計算する際に、同じ部分を何回も使用していることに気がつく。
• 同じ部分を「平方分割」によって処理することを考える。
• 手前 10 項を覚えておけば次の項を計算することができることを利用
する。
• func(s,t,dp[s-1],dp[s-2],…,dp[s-10]) = dp[t],dp[t-1], … , dp[t-9] のそれ
ぞれの値を、dp[s-1], dp[s-2], … , dp[s-10] を用いて変換する関数。
• func の返り値は 10 個ある。
どゆこと?
• 例として dp[99] の値を知りたいときに、 dp[20],dp[19],dp[18],
… ,dp[11] の値さえわかっていれば、
dp[99]=c(20,99,21) * dp[20] + c(19,99,21) * dp[19] + … +
c(11,99,21) * dp[11]
と表記できる。
ここで、c(x,y,z)=(x から y まで移動するものの中で、最初のジャンプで z
以上の石に移動するものの総数) となる。
• dp[98] から dp[90] までについても同様に計算すれば
func(21,99, ,dp[20],dp[19],...,dp[11]) の完成となる。
func の計算について
• c (s,t,u)は部分点解法と同じ方針で O(t-s) で計算できる。
• 「1 回目のジャンプで u 以上に移動する組み合わせ」としなければな
らないことに注意 (同じジャンプ重複して数えてしまう)。
• c (s,t,u) は、各 func に対して最大 100 種類計算すれば OK。
• func の計算は、1 つの func につき O( 𝑁) (100* 𝑁) となる。
満点解法
• func(𝑘 𝑁, (𝑘 + 1) 𝑁) (0 ≦ 𝑘 ≦ 𝑁) を計算しておき、各トレーニン
グについて、𝑠𝑖 から 𝑁 の倍数になるまで部分点解法と同じ
DP(1)→func で 𝑁 個ずつ飛ばせるだけ飛ばす(2)→ 𝑡𝑖になるまで部
分点解法と同じDP(3)
• func の計算は、1 つの func につき O( 𝑁) なので、全体で O(𝑁) とな
る。
• この方針でfunc を求めた後は O(𝐷 𝑁) となる。
𝑠𝑖
𝑡𝑖𝑝 𝑁 (𝑝 + 1) 𝑁 𝑞 𝑁
(1) (3)
(2)(2) (2)(2)
(中略)
…
補足
• func は 10 × 10 行列として表現できる。
• (𝑛 × 𝑛行列)* (𝑛 × 𝑛行列)*…* (𝑛 × 𝑛行列)* (𝑛 要素ベクトル) の計算
において、* の個数を 𝑚 とする。このとき、
・* を左から処理→行列*行列=行列を繰り返し、O(𝑛3
𝑚)
・* を右から処理→行列*ベクトル=ベクトルを繰り返し、O(𝑛2 𝑚)
となり、この問題でも速度に 10 倍もの差が出る。このため、ベクトル
を利用した計算をしたほうが速くなる。func を利用した計算の際には
注意。

More Related Content

What's hot

AtCoder Regular Contest 034 解説
AtCoder Regular Contest 034 解説AtCoder Regular Contest 034 解説
AtCoder Regular Contest 034 解説AtCoder Inc.
 
CODE FESTIVAL 2014 本選 解説
CODE FESTIVAL 2014 本選 解説CODE FESTIVAL 2014 本選 解説
CODE FESTIVAL 2014 本選 解説AtCoder Inc.
 
AtCoder Beginner Contest 018 解説
AtCoder Beginner Contest 018 解説AtCoder Beginner Contest 018 解説
AtCoder Beginner Contest 018 解説AtCoder Inc.
 
AtCoder Beginner Contest 026 解説
AtCoder Beginner Contest 026 解説AtCoder Beginner Contest 026 解説
AtCoder Beginner Contest 026 解説AtCoder Inc.
 
AtCoder Regular Contest 024 解説
AtCoder Regular Contest 024 解説AtCoder Regular Contest 024 解説
AtCoder Regular Contest 024 解説AtCoder Inc.
 
AtCoder Beginner Contest 025 解説
AtCoder Beginner Contest 025 解説AtCoder Beginner Contest 025 解説
AtCoder Beginner Contest 025 解説AtCoder Inc.
 
AtCoder Beginner Contest 021 解説
AtCoder Beginner Contest 021 解説AtCoder Beginner Contest 021 解説
AtCoder Beginner Contest 021 解説AtCoder Inc.
 
AtCoder Beginner Contest 034 解説
AtCoder Beginner Contest 034 解説AtCoder Beginner Contest 034 解説
AtCoder Beginner Contest 034 解説AtCoder Inc.
 
AtCoder Regular Contest 019 解説
AtCoder Regular Contest 019 解説AtCoder Regular Contest 019 解説
AtCoder Regular Contest 019 解説AtCoder Inc.
 
AtCoder Beginner Contest 016 解説
AtCoder Beginner Contest 016 解説AtCoder Beginner Contest 016 解説
AtCoder Beginner Contest 016 解説AtCoder Inc.
 
AtCoder Regular Contest 040 解説
AtCoder Regular Contest 040 解説AtCoder Regular Contest 040 解説
AtCoder Regular Contest 040 解説AtCoder Inc.
 
AtCoder Regular Contest 017
AtCoder Regular Contest 017AtCoder Regular Contest 017
AtCoder Regular Contest 017AtCoder Inc.
 
Indeedなう 予選A 解説
Indeedなう 予選A 解説Indeedなう 予選A 解説
Indeedなう 予選A 解説AtCoder Inc.
 
AtCoder Regular Contest 032 解説
AtCoder Regular Contest 032 解説AtCoder Regular Contest 032 解説
AtCoder Regular Contest 032 解説AtCoder Inc.
 
AtCoder Regular Contest 038 解説
AtCoder Regular Contest 038 解説AtCoder Regular Contest 038 解説
AtCoder Regular Contest 038 解説AtCoder Inc.
 
Arc015途中まで解説
Arc015途中まで解説Arc015途中まで解説
Arc015途中まで解説AtCoder Inc.
 
AtCoder Regular Contest 031 解説
AtCoder Regular Contest 031 解説AtCoder Regular Contest 031 解説
AtCoder Regular Contest 031 解説AtCoder Inc.
 
AtCoder Regular Contest 018 解説
AtCoder Regular Contest 018 解説AtCoder Regular Contest 018 解説
AtCoder Regular Contest 018 解説AtCoder Inc.
 

What's hot (20)

AtCoder Regular Contest 034 解説
AtCoder Regular Contest 034 解説AtCoder Regular Contest 034 解説
AtCoder Regular Contest 034 解説
 
CODE FESTIVAL 2014 本選 解説
CODE FESTIVAL 2014 本選 解説CODE FESTIVAL 2014 本選 解説
CODE FESTIVAL 2014 本選 解説
 
Arc041
Arc041Arc041
Arc041
 
AtCoder Beginner Contest 018 解説
AtCoder Beginner Contest 018 解説AtCoder Beginner Contest 018 解説
AtCoder Beginner Contest 018 解説
 
AtCoder Beginner Contest 026 解説
AtCoder Beginner Contest 026 解説AtCoder Beginner Contest 026 解説
AtCoder Beginner Contest 026 解説
 
AtCoder Regular Contest 024 解説
AtCoder Regular Contest 024 解説AtCoder Regular Contest 024 解説
AtCoder Regular Contest 024 解説
 
AtCoder Beginner Contest 025 解説
AtCoder Beginner Contest 025 解説AtCoder Beginner Contest 025 解説
AtCoder Beginner Contest 025 解説
 
AtCoder Beginner Contest 021 解説
AtCoder Beginner Contest 021 解説AtCoder Beginner Contest 021 解説
AtCoder Beginner Contest 021 解説
 
AtCoder Beginner Contest 034 解説
AtCoder Beginner Contest 034 解説AtCoder Beginner Contest 034 解説
AtCoder Beginner Contest 034 解説
 
AtCoder Regular Contest 019 解説
AtCoder Regular Contest 019 解説AtCoder Regular Contest 019 解説
AtCoder Regular Contest 019 解説
 
AtCoder Beginner Contest 016 解説
AtCoder Beginner Contest 016 解説AtCoder Beginner Contest 016 解説
AtCoder Beginner Contest 016 解説
 
AtCoder Regular Contest 040 解説
AtCoder Regular Contest 040 解説AtCoder Regular Contest 040 解説
AtCoder Regular Contest 040 解説
 
AtCoder Regular Contest 017
AtCoder Regular Contest 017AtCoder Regular Contest 017
AtCoder Regular Contest 017
 
Indeedなう 予選A 解説
Indeedなう 予選A 解説Indeedなう 予選A 解説
Indeedなう 予選A 解説
 
AtCoder Regular Contest 032 解説
AtCoder Regular Contest 032 解説AtCoder Regular Contest 032 解説
AtCoder Regular Contest 032 解説
 
AtCoder Regular Contest 038 解説
AtCoder Regular Contest 038 解説AtCoder Regular Contest 038 解説
AtCoder Regular Contest 038 解説
 
Arc015途中まで解説
Arc015途中まで解説Arc015途中まで解説
Arc015途中まで解説
 
Abc009
Abc009Abc009
Abc009
 
AtCoder Regular Contest 031 解説
AtCoder Regular Contest 031 解説AtCoder Regular Contest 031 解説
AtCoder Regular Contest 031 解説
 
AtCoder Regular Contest 018 解説
AtCoder Regular Contest 018 解説AtCoder Regular Contest 018 解説
AtCoder Regular Contest 018 解説
 

Similar to AtCoder Regular Contest 027 解説

JOI本選 夜店(NightMarket)解説
JOI本選 夜店(NightMarket)解説JOI本選 夜店(NightMarket)解説
JOI本選 夜店(NightMarket)解説Hiroshi Yamashita
 
AtCoder Beginner Contest 035 解説
AtCoder Beginner Contest 035 解説AtCoder Beginner Contest 035 解説
AtCoder Beginner Contest 035 解説AtCoder Inc.
 
Schönhage Strassen Algorithm
Schönhage Strassen AlgorithmSchönhage Strassen Algorithm
Schönhage Strassen Algorithmcookies 146
 
K2PC Div1 E 暗号化
K2PC Div1 E 暗号化K2PC Div1 E 暗号化
K2PC Div1 E 暗号化Kazuma Mikami
 
AtCoder Beginner Contest 010 解説
AtCoder Beginner Contest 010 解説AtCoder Beginner Contest 010 解説
AtCoder Beginner Contest 010 解説AtCoder Inc.
 
第15回 配信講義 計算科学技術特論B(2022)
第15回 配信講義 計算科学技術特論B(2022)第15回 配信講義 計算科学技術特論B(2022)
第15回 配信講義 計算科学技術特論B(2022)RCCSRENKEI
 
CODE THANKS FESTIVAL 2014 A日程 解説
CODE THANKS FESTIVAL 2014 A日程 解説CODE THANKS FESTIVAL 2014 A日程 解説
CODE THANKS FESTIVAL 2014 A日程 解説AtCoder Inc.
 
線形微分方程式
線形微分方程式線形微分方程式
線形微分方程式HanpenRobot
 
虫食算を作るアルゴリズム 公表Ver
虫食算を作るアルゴリズム 公表Ver虫食算を作るアルゴリズム 公表Ver
虫食算を作るアルゴリズム 公表VerKensuke Otsuki
 
HAPPY NEW YEAR 2017 コンテスト 解説
HAPPY NEW YEAR 2017 コンテスト 解説HAPPY NEW YEAR 2017 コンテスト 解説
HAPPY NEW YEAR 2017 コンテスト 解説皓介 三田
 
暗号技術の実装と数学
暗号技術の実装と数学暗号技術の実装と数学
暗号技術の実装と数学MITSUNARI Shigeo
 
AtCoder Beginner Contest 008 解説
AtCoder Beginner Contest 008 解説AtCoder Beginner Contest 008 解説
AtCoder Beginner Contest 008 解説AtCoder Inc.
 
University CodeSprint 4 - Magic value
University CodeSprint 4 - Magic valueUniversity CodeSprint 4 - Magic value
University CodeSprint 4 - Magic valuesatanic
 
九九の表から学ぶ計算量の考え方
九九の表から学ぶ計算量の考え方九九の表から学ぶ計算量の考え方
九九の表から学ぶ計算量の考え方Rute
 
Operations research yonezawa_no2
Operations research yonezawa_no2Operations research yonezawa_no2
Operations research yonezawa_no2ssuser0bebd2
 
AtCoder Beginner Contest 019 解説
AtCoder Beginner Contest 019 解説AtCoder Beginner Contest 019 解説
AtCoder Beginner Contest 019 解説AtCoder Inc.
 

Similar to AtCoder Regular Contest 027 解説 (20)

JOI本選 夜店(NightMarket)解説
JOI本選 夜店(NightMarket)解説JOI本選 夜店(NightMarket)解説
JOI本選 夜店(NightMarket)解説
 
AtCoder Beginner Contest 035 解説
AtCoder Beginner Contest 035 解説AtCoder Beginner Contest 035 解説
AtCoder Beginner Contest 035 解説
 
Schönhage Strassen Algorithm
Schönhage Strassen AlgorithmSchönhage Strassen Algorithm
Schönhage Strassen Algorithm
 
K2PC Div1 E 暗号化
K2PC Div1 E 暗号化K2PC Div1 E 暗号化
K2PC Div1 E 暗号化
 
AtCoder Beginner Contest 010 解説
AtCoder Beginner Contest 010 解説AtCoder Beginner Contest 010 解説
AtCoder Beginner Contest 010 解説
 
Aizu-2017: B
Aizu-2017: BAizu-2017: B
Aizu-2017: B
 
Za atsu-20170328
Za atsu-20170328Za atsu-20170328
Za atsu-20170328
 
ARC#003D
ARC#003DARC#003D
ARC#003D
 
第15回 配信講義 計算科学技術特論B(2022)
第15回 配信講義 計算科学技術特論B(2022)第15回 配信講義 計算科学技術特論B(2022)
第15回 配信講義 計算科学技術特論B(2022)
 
CODE THANKS FESTIVAL 2014 A日程 解説
CODE THANKS FESTIVAL 2014 A日程 解説CODE THANKS FESTIVAL 2014 A日程 解説
CODE THANKS FESTIVAL 2014 A日程 解説
 
線形微分方程式
線形微分方程式線形微分方程式
線形微分方程式
 
虫食算を作るアルゴリズム 公表Ver
虫食算を作るアルゴリズム 公表Ver虫食算を作るアルゴリズム 公表Ver
虫食算を作るアルゴリズム 公表Ver
 
HAPPY NEW YEAR 2017 コンテスト 解説
HAPPY NEW YEAR 2017 コンテスト 解説HAPPY NEW YEAR 2017 コンテスト 解説
HAPPY NEW YEAR 2017 コンテスト 解説
 
暗号技術の実装と数学
暗号技術の実装と数学暗号技術の実装と数学
暗号技術の実装と数学
 
AtCoder Beginner Contest 008 解説
AtCoder Beginner Contest 008 解説AtCoder Beginner Contest 008 解説
AtCoder Beginner Contest 008 解説
 
University CodeSprint 4 - Magic value
University CodeSprint 4 - Magic valueUniversity CodeSprint 4 - Magic value
University CodeSprint 4 - Magic value
 
直交領域探索
直交領域探索直交領域探索
直交領域探索
 
九九の表から学ぶ計算量の考え方
九九の表から学ぶ計算量の考え方九九の表から学ぶ計算量の考え方
九九の表から学ぶ計算量の考え方
 
Operations research yonezawa_no2
Operations research yonezawa_no2Operations research yonezawa_no2
Operations research yonezawa_no2
 
AtCoder Beginner Contest 019 解説
AtCoder Beginner Contest 019 解説AtCoder Beginner Contest 019 解説
AtCoder Beginner Contest 019 解説
 

More from AtCoder Inc.

AtCoderに毎回参加したくなる仕組み
AtCoderに毎回参加したくなる仕組みAtCoderに毎回参加したくなる仕組み
AtCoderに毎回参加したくなる仕組みAtCoder Inc.
 
Square869120 contest #2
Square869120 contest #2Square869120 contest #2
Square869120 contest #2AtCoder Inc.
 
Chokudai Contest 001
Chokudai Contest 001Chokudai Contest 001
Chokudai Contest 001AtCoder Inc.
 
AtCoder Regular Contest 049 解説
AtCoder Regular Contest 049 解説AtCoder Regular Contest 049 解説
AtCoder Regular Contest 049 解説AtCoder Inc.
 
AtCoder Regular Contest 048
AtCoder Regular Contest 048AtCoder Regular Contest 048
AtCoder Regular Contest 048AtCoder Inc.
 
MUJINプログラミングチャレンジ2016 解説
MUJINプログラミングチャレンジ2016 解説MUJINプログラミングチャレンジ2016 解説
MUJINプログラミングチャレンジ2016 解説AtCoder Inc.
 
AtCoder Beginner Contest 033 解説
AtCoder Beginner Contest 033 解説AtCoder Beginner Contest 033 解説
AtCoder Beginner Contest 033 解説AtCoder Inc.
 
DDPC 2016 予選 解説
DDPC 2016 予選 解説DDPC 2016 予選 解説
DDPC 2016 予選 解説AtCoder Inc.
 
CODE FESTIVAL 2015 沖縄ツアー 解説
CODE FESTIVAL 2015 沖縄ツアー 解説CODE FESTIVAL 2015 沖縄ツアー 解説
CODE FESTIVAL 2015 沖縄ツアー 解説AtCoder Inc.
 
AtCoder Regular Contest 046
AtCoder Regular Contest 046AtCoder Regular Contest 046
AtCoder Regular Contest 046AtCoder Inc.
 
CODE FESTIVAL 2015 解説
CODE FESTIVAL 2015 解説CODE FESTIVAL 2015 解説
CODE FESTIVAL 2015 解説AtCoder Inc.
 
CODE FESTIVAL 2015 予選B 解説
CODE FESTIVAL 2015 予選B 解説CODE FESTIVAL 2015 予選B 解説
CODE FESTIVAL 2015 予選B 解説AtCoder Inc.
 
AtCoder Beginner Contest 030 解説
AtCoder Beginner Contest 030 解説AtCoder Beginner Contest 030 解説
AtCoder Beginner Contest 030 解説AtCoder Inc.
 
AtCoder Regular Contest 045 解説
AtCoder Regular Contest 045 解説AtCoder Regular Contest 045 解説
AtCoder Regular Contest 045 解説AtCoder Inc.
 
CODE FESTIVAL 2015 予選A 解説
CODE FESTIVAL 2015 予選A 解説CODE FESTIVAL 2015 予選A 解説
CODE FESTIVAL 2015 予選A 解説AtCoder Inc.
 
AtCoder Beginner Contest 029 解説
AtCoder Beginner Contest 029 解説AtCoder Beginner Contest 029 解説
AtCoder Beginner Contest 029 解説AtCoder Inc.
 
AtCoder Beginner Contest 028 解説
AtCoder Beginner Contest 028 解説AtCoder Beginner Contest 028 解説
AtCoder Beginner Contest 028 解説AtCoder Inc.
 

More from AtCoder Inc. (20)

TCO2017R1
TCO2017R1TCO2017R1
TCO2017R1
 
AtCoderに毎回参加したくなる仕組み
AtCoderに毎回参加したくなる仕組みAtCoderに毎回参加したくなる仕組み
AtCoderに毎回参加したくなる仕組み
 
Square869120 contest #2
Square869120 contest #2Square869120 contest #2
Square869120 contest #2
 
Chokudai Contest 001
Chokudai Contest 001Chokudai Contest 001
Chokudai Contest 001
 
AtCoder Regular Contest 049 解説
AtCoder Regular Contest 049 解説AtCoder Regular Contest 049 解説
AtCoder Regular Contest 049 解説
 
AtCoder Regular Contest 048
AtCoder Regular Contest 048AtCoder Regular Contest 048
AtCoder Regular Contest 048
 
MUJINプログラミングチャレンジ2016 解説
MUJINプログラミングチャレンジ2016 解説MUJINプログラミングチャレンジ2016 解説
MUJINプログラミングチャレンジ2016 解説
 
AtCoder Beginner Contest 033 解説
AtCoder Beginner Contest 033 解説AtCoder Beginner Contest 033 解説
AtCoder Beginner Contest 033 解説
 
DDPC 2016 予選 解説
DDPC 2016 予選 解説DDPC 2016 予選 解説
DDPC 2016 予選 解説
 
arc047
arc047arc047
arc047
 
CODE FESTIVAL 2015 沖縄ツアー 解説
CODE FESTIVAL 2015 沖縄ツアー 解説CODE FESTIVAL 2015 沖縄ツアー 解説
CODE FESTIVAL 2015 沖縄ツアー 解説
 
AtCoder Regular Contest 046
AtCoder Regular Contest 046AtCoder Regular Contest 046
AtCoder Regular Contest 046
 
abc031
abc031abc031
abc031
 
CODE FESTIVAL 2015 解説
CODE FESTIVAL 2015 解説CODE FESTIVAL 2015 解説
CODE FESTIVAL 2015 解説
 
CODE FESTIVAL 2015 予選B 解説
CODE FESTIVAL 2015 予選B 解説CODE FESTIVAL 2015 予選B 解説
CODE FESTIVAL 2015 予選B 解説
 
AtCoder Beginner Contest 030 解説
AtCoder Beginner Contest 030 解説AtCoder Beginner Contest 030 解説
AtCoder Beginner Contest 030 解説
 
AtCoder Regular Contest 045 解説
AtCoder Regular Contest 045 解説AtCoder Regular Contest 045 解説
AtCoder Regular Contest 045 解説
 
CODE FESTIVAL 2015 予選A 解説
CODE FESTIVAL 2015 予選A 解説CODE FESTIVAL 2015 予選A 解説
CODE FESTIVAL 2015 予選A 解説
 
AtCoder Beginner Contest 029 解説
AtCoder Beginner Contest 029 解説AtCoder Beginner Contest 029 解説
AtCoder Beginner Contest 029 解説
 
AtCoder Beginner Contest 028 解説
AtCoder Beginner Contest 028 解説AtCoder Beginner Contest 028 解説
AtCoder Beginner Contest 028 解説
 

AtCoder Regular Contest 027 解説

  • 1. AtCoder Regular Contest 027 解説 2014/8/2 1
  • 2. A 問題 – 門限
  • 3. 問題概要 • 現在の時間 ℎ と分 𝑚 が与えられる。 • 後何分で 18 時 0 分かを求める。 • 0 ≦ ℎ ≦ 17 , 0 ≦ 𝑚 ≦ 59 ※標準的な入出力については、ABC004 の解説等を参照してください。
  • 4. 解法その 1 • 18 時まであと何時間何分かを求めて、その後分に変換する。 • 現在時刻が ℎ 時 𝑚 分なら、 ・ 𝑚 = 0 ⇒ あと 18 − ℎ 時間 ・ 𝑚 ≠ 0 ⇒ あと 17 − ℎ 時間と 60 − 𝑚 分 • 計算結果を 𝑎 時間 𝑏 分とすると、 a × 60 + 𝑏 分が答え。 • 最初に、現在時刻を 0 時ちょうどからの経過分数に変換して、1080 から引いても良い。
  • 5. 解法その 2 • 現在時刻から、1 分後、2 分後、…と 1 分ずつ加算して、18 時ちょうど になるまでに合計何回足したかを数える。 • どちらの方針にするかは、実装時間やバグの入りやすさなどを考慮 して選択 (個人差あり)。
  • 7. 問題概要 • 0 から 9 までと、大文字アルファベットのみで構成された長さ 𝑁 の文 字列が 2 個与えられる。 • 大文字アルファベットを 0 から 9 までの整数に変換する処理を行っ た結果、両者が表す整数が一致した。 • 一致した整数として全部で何通り考えられるかを求めよ。 • 1 ≦ 𝑁 ≦ 18
  • 9. 満点解法 • 部分点解法では、計算量が O(10 𝑁) となるので、𝑁が大きい場合に は時間が掛かり過ぎる。 • 一致しているという条件をうまく言い換えたい。 • ここでは、「グラフ」の概念を導入すると理解しやすくなる。 • それぞれの文字を頂点としたグラフを考える。 • 同じ数字でなければならない文字同士を辺で結ぶ。 • 同じ数字でなければならない文字同士というのは、同じ桁 (同じ位) にある文字同士のことである。(例えば、2 つの文字列がABCDとEFEH だった場合は、AE,BF,CE,DH 間に辺を結ぶ。)
  • 10. 満点解法 • 数字と文字が同じ桁にある場合は、その文字に、「その数字でなければな らない」という条件を付加する。 • 最上位にある文字については、さらに「0以外」という条件も。 • なお、この条件は衝突しない(衝突したら答えがなくなるため)。 • その後、各連結成分(辺同士で行き来できる頂点たち)について、 ・数字が割り当てられている⇒1 通り ・数字が割り当てられていない、かつ最上位⇒9 通り ・数字が割り当てられていない、かつ最上位でない⇒10 通り をそれぞれ掛け合わせると答え。
  • 11. 例(入力例 3 – PRBLMB と ARC027) • 文字を頂点としたグラフを考える。 P R A C B L M
  • 12. 例(入力例 3 – PRBLMB と ARC027) • 文字を頂点としたグラフを考える。 • 同じ数字になるもの同士を辺で結ぶ(PA,BC)。 P R A C B L M
  • 13. 例(入力例 3 – PRBLMB と ARC027) • 文字を頂点としたグラフを考える。 • 同じ数字になるもの同士を辺で結ぶ(PA,BC)。 • 文字と数字の割り当てを反映させる(L=0,M=2,B=7)。 P R A C B L M 0 27
  • 14. 例(入力例 3 – PRBLMB と ARC027) • 文字を頂点としたグラフを考える。 • 同じ数字になるもの同士を辺で結ぶ(PA,BC)。 • 文字と数字の割り当てを反映させる(L=0,M=2,B=7)。 • 最上位の情報も付ける。 P R A C B L M 0 27最上位
  • 15. 例(入力例 3 – PRBLMB と ARC027) • 文字を頂点としたグラフを考える。 • 同じ数字になるもの同士を辺で結ぶ(PA,BC)。 • 文字と数字の割り当てを反映させる(L=0,M=2,B=7)。 • 最上位の情報も付ける。 P R A C B L M 0 27最上位 9 通り × 10通り × 1 通り× 1 通り× 1 通り = 90 通り
  • 16. 補足 • グラフの連結判定には、union-find を利用すると効率的 & 実装しや すい。 • サイズが小さいので探索をしても良いが、union-find を知っていると 色々と便利なので、ぜひとも覚えておこう! • 前回(ARC026)の解説にも載っているので、参考にしてください。 • http://www.slideshare.net/chokudai/arc026
  • 18. 問題概要 • スペシャルチケット 𝑋 枚と通常のチケット 𝑌 枚を持っている。 • 𝑁 個のトッピングがあり、トッピング 𝑖 は 𝑡𝑖 枚のチケット(うち 1 枚以 上はスペシャルチケット) と交換でき、嬉しさは ℎ𝑖 である。 • 同じトッピングは複数回入手できない。 • 嬉しさの合計値として最大なものを求めよ。 • 1 ≦ 𝑋 ≦ 300 , 0 ≦ 𝑌 ≦ 300, 1 ≦ 𝑁 ≦ 300 • 1 ≦ 𝑡𝑖 ≦ 600, 1 ≦ ℎ𝑖 ≦ 5,000,000
  • 19. 部分点解法 • この問題はナップサック問題の一種。 • 動的計画法を用いると効率的に解答することができる。 • dp[i][j][k] = (現在トッピング i まで処理しており、すでにスペシャルチ ケットを j 枚、通常のチケットを k 枚消費している場合での嬉しさの 合計値の最大値) とすると、 dp[i][j][k] = max{dp[i-1][j][k] , dp[i-1][j-m][k- t_i +m] + h_i (1 ≦ m ≦ t_i)} (細かい境界条件は割愛) • O(𝑋𝑌𝑁(𝑋 + 𝑌)) となる。
  • 20. 満点解法 • 先ほどの場合、交換可能なすべての組み合わせを試していたが、出 来る限りスペシャルチケットの消費数を抑えられるものを選んだほう がいいのでは? • 実際、消費枚数が最も少ない (m が最小) となるもののみを考慮して も最適解を得られる。 • 実はこの問題は、「チケットを 𝑋 + 𝑌 枚持っており、トッピングは最大 𝑋 個しか選べない場合の最大化」と同じ問題。 • dp[i][j][k] = (現在トッピング i まで処理しており、トッピングを j 個採用 しており、チケットを k 枚消費している場合での嬉しさの合計値の最 大値) とおく動的計画法なら O(𝑋𝑁(𝑋 + 𝑌)) となる。
  • 22. 問題概要 • 𝑁 個の石があり、石 𝑖 からは ℎ𝑖 個先まで跳べる。 • 石 𝑠𝑖 から石 𝑡𝑖 までジャンプで移動する組み合わせが何個あるか、と いうクエリを 𝐷 個解け。 • 同じトッピングは複数回入手できない。 • 嬉しさの合計値として最大なものを求めよ。 • 1 ≦ 𝑁 ≦ 300,000 , 1 ≦ 𝐷 ≦ 5,000, 1 ≦ ℎ𝑖 ≦ 10 • 1 ≦ 𝑠𝑖 <𝑡𝑖 ≦ 𝑁
  • 23. 部分点解法 • この問題も動的計画法によって計算できる。 • dp[i]=(石 i までの行き方) とおくと、 dp[i] = (dp[i − j] ∗ 𝑓(i − j, i)10 j=1 ) ここで、𝑓 𝑥, 𝑦 は𝑥 + ℎ 𝑥 ≧ 𝑦なら 1 、そうでないなら 0 を取る関数とす る。 • 手前 10 項 (dp[i-1],dp[i-2],…,dp[i-10])を覚えておけば良い。 • 毎回 O(𝑁) で計算すれば O(𝑁𝐷) となる。
  • 24. 満点解法 • 毎回計算する際に、同じ部分を何回も使用していることに気がつく。 • 同じ部分を「平方分割」によって処理することを考える。 • 手前 10 項を覚えておけば次の項を計算することができることを利用 する。 • func(s,t,dp[s-1],dp[s-2],…,dp[s-10]) = dp[t],dp[t-1], … , dp[t-9] のそれ ぞれの値を、dp[s-1], dp[s-2], … , dp[s-10] を用いて変換する関数。 • func の返り値は 10 個ある。
  • 25. どゆこと? • 例として dp[99] の値を知りたいときに、 dp[20],dp[19],dp[18], … ,dp[11] の値さえわかっていれば、 dp[99]=c(20,99,21) * dp[20] + c(19,99,21) * dp[19] + … + c(11,99,21) * dp[11] と表記できる。 ここで、c(x,y,z)=(x から y まで移動するものの中で、最初のジャンプで z 以上の石に移動するものの総数) となる。 • dp[98] から dp[90] までについても同様に計算すれば func(21,99, ,dp[20],dp[19],...,dp[11]) の完成となる。
  • 26. func の計算について • c (s,t,u)は部分点解法と同じ方針で O(t-s) で計算できる。 • 「1 回目のジャンプで u 以上に移動する組み合わせ」としなければな らないことに注意 (同じジャンプ重複して数えてしまう)。 • c (s,t,u) は、各 func に対して最大 100 種類計算すれば OK。 • func の計算は、1 つの func につき O( 𝑁) (100* 𝑁) となる。
  • 27. 満点解法 • func(𝑘 𝑁, (𝑘 + 1) 𝑁) (0 ≦ 𝑘 ≦ 𝑁) を計算しておき、各トレーニン グについて、𝑠𝑖 から 𝑁 の倍数になるまで部分点解法と同じ DP(1)→func で 𝑁 個ずつ飛ばせるだけ飛ばす(2)→ 𝑡𝑖になるまで部 分点解法と同じDP(3) • func の計算は、1 つの func につき O( 𝑁) なので、全体で O(𝑁) とな る。 • この方針でfunc を求めた後は O(𝐷 𝑁) となる。 𝑠𝑖 𝑡𝑖𝑝 𝑁 (𝑝 + 1) 𝑁 𝑞 𝑁 (1) (3) (2)(2) (2)(2) (中略) …
  • 28. 補足 • func は 10 × 10 行列として表現できる。 • (𝑛 × 𝑛行列)* (𝑛 × 𝑛行列)*…* (𝑛 × 𝑛行列)* (𝑛 要素ベクトル) の計算 において、* の個数を 𝑚 とする。このとき、 ・* を左から処理→行列*行列=行列を繰り返し、O(𝑛3 𝑚) ・* を右から処理→行列*ベクトル=ベクトルを繰り返し、O(𝑛2 𝑚) となり、この問題でも速度に 10 倍もの差が出る。このため、ベクトル を利用した計算をしたほうが速くなる。func を利用した計算の際には 注意。