SlideShare a Scribd company logo
1 of 29
Download to read offline
AtCoder Regular Contest 021
解説
AtCoder株式会社
2014/4/19 1
A問題
DEAD END
A - 問題概要
問題

タイルを滑らせることで同じ数をぶつけて

大きい数にしていくゲームの盤面が与えられる。

ゲームオーバーの状態かどうかを判定せよ。
A - 重要なポイント
与えられる盤面では空いているマスはない!

↓
同じ数をぶつけるような操作が必要

しかも、隣り合う数をぶつけるしかない
A - 解き方
整理すると……

上下左右に隣り合う同じ数が ある → CONTINUE

              ない → GAMEOVER
実装

・2 重ループを回す(添字に注意)

・if 文を書きまくって全部調べる(列挙漏れに注意)

(きちんとループで書けるようになっておいた方がいい)
ARC #021 B 問題解説
解説:城下 慎也 (@phidnight)
問題概要
• 𝑁 個の非負整数 𝐵1, 𝐵2, … , 𝐵 𝑁 が与えられる。
• 𝐵𝑖 = 𝐴𝑖^𝐴𝑖+1(ただし 𝐴 𝑁+1 = 𝐴1) である。
(以降、^ を排他的論理和(xor) の記号として表す。)
• 𝐵1, 𝐵2, … , 𝐵 𝑁 として考えられるものが存在するな
ら辞書順最小を求めよ。ないならないことを指摘
せよ。
• 2 ≦ 𝑁 ≦ 100,000
排他的論理和の性質(例)
• 𝐴, 𝐵, 𝐶 を非負整数とすると
• 結合則(𝐴^𝐵)^𝐶= 𝐴^(𝐵^𝐶) が成立する。
• 交換則𝐴^𝐵= 𝐵^𝐴 が成立する。
• 𝐴^0= 𝐴 (零元)
• 𝐴^𝐴= 0 (それ自身と xor すると零元になる。)
• これらの性質を利用してこの問題を考える。
考察
• 𝐴1を固定して考えてみる。
• 𝐵1 =𝐴1^ 𝐴2より𝐴2=𝐴1^ 𝐵1
(∵ 𝐴2=0^𝐴2=(𝐴1^𝐴1)^𝐴2=𝐴1^(𝐴1^𝐴2)=𝐴1^ 𝐵1)
• 同様に、 𝐵2 =𝐴2^ 𝐴3より𝐴3=(𝐴1^𝐵1)^𝐵2
(∵ 𝐴3=𝐴2^𝐵2=前述の𝐴2を代入)
• 一般に 𝐴𝑖=𝐴1^𝐵1^𝐵2^…^𝐵𝑖−1 (𝑖 ≧ 2)が成立
することを示す。
考察
• 𝐴𝑖=𝐴1^𝐵1^𝐵2^…^𝐵𝑖−1 (𝑖 ≧ 2)が成立する。
(∵𝐴𝑖=(𝐴1^𝐴1)^(𝐴2^𝐴2)^…^(𝐴𝑖−1^𝐴𝑖−1)^𝐴𝑖
=𝐴1^(𝐴1^𝐴2)^ (𝐴2^𝐴3) ^…^(𝐴𝑖−1^𝐴𝑖)
=𝐴1^𝐵1^𝐵2^…^𝐵𝑖−1)
• 以上のことより、𝐴1が定まれば、𝐴2から𝐴 𝑁ま
でのすべての値が𝐵1から𝐵 𝑁−1までの値を用
いて、一意に定まることがわかる。
解の存在判定について
• 使用されなかった𝐵 𝑁については、先ほどの計
算で出てきた値と𝐵 𝑁= 𝐴 𝑁^ 𝐴1が矛盾する場
合がある。
• 𝐴 𝑁^ 𝐴1= 𝐵1^ 𝐵2^…^ 𝐵 𝑁−1となるので𝐵 𝑁は𝐴1
に依存せずこの値に一致するはずである。
• 矛盾したならば解が存在しない。
• 矛盾しないなら、 𝐴1を任意に指定した後、解
が一意に定まる。
辞書順最小
• 解が存在した場合に、辞書順最小なものを求
める必要がある。
• 先頭の値 (𝐴1) ができるだけ小さいほうが良
い。
• 今回の場合では、𝐴1=0のケースがただ 1 通
りだけ存在するので、その1 通りが辞書順最
小の値となる。(𝐴2以降を比較する必要はな
い。)
• これを計算して答えが得られる。
まとめ
• 𝐵 𝑁=𝐵1^ 𝐵2^…^ 𝐵 𝑁−1が成立しないなら解なし、
成立するなら𝐴1= 0と置いて順に解を計算す
る。
• 排他的論理和の性質を利用した問題は様々
なものがあるので、排他的論理和の問題に
は慣れておこう!
ARC #021 C 問題解説
解説:城下 慎也 (@phidnight)
問題概要
• 高橋君は建物を 𝐾 回増築したい。
• 高橋君は 𝑁 軒の建物を所有している。
• 増築には、増築する建物について、現在の価格
だけ費用がかかり、増築で一定値値上がりする。
• 合計費用として考えられるものの最小値はいくら
か。
• 1 ≦ 𝐾 ≦ 100,000,000
• 1 ≦ 𝑁 ≦ 100,000
部分点解法 その1
• 毎回どの建物を増築するかを𝑁 通りから選ぶ解
法だと O(𝑁 𝐾
) 通りになってしまう。
• 考えてみると、異なる建物同士の増築の順番を
考慮しなくてもよいことが分かる。
• つまり、「建物1 を増築しまくる」→ 「建物2 を増築
しまくる」→… という順番を付けてもOK。
• すると、dp[i][j]=(i 番目の建物までの増築が完了
したときに、今まで j 回増築している場合の最小
費用) とする DP を組めば O(𝐾2
𝑁) で計算するこ
とができる。これで 30 点が得られる。
部分点解法 その2,3
• 実は、毎回「現在の費用が最小なものを増築
し続ける」という貪欲法で正解を得ることがで
きる。
• 以降の数枚でそのことを示す。
• この貪欲法を毎回すべて見る方針で実装す
れば O(𝐾𝑁) で解ける。計40点が得られる。
• priority_queue を使用すればO(𝐾 log 𝑁) とな
り、通算55点が得られる。
貪欲法が適用可能なことの証明
• 建物の増築回数と価格を照らしあわせた表
は例えば次のようになる。
ID A D 0 回増築 1 回増築 2 回増築 3 回増築
1 50 40 50 90 130 170
2 40 80 40 120 200 240
3 70 50 70 120 170 220
4 60 60 60 120 180 240
貪欲法が適用可能なことの証明
• 建物の増築回数と価格を照らしあわせた表
は例えば次のようになる。
• ここから 𝐾 個良いものを (途中が飛んでも良
い) 選ぶアルゴリズムは貪欲法で実装できる。
ID A D 0 回増築 1 回増築 2 回増築 3 回増築
1 50 40 50 90 130 170
2 40 80 40 120 200 240
3 70 50 70 120 170 220
4 60 60 60 120 180 240
貪欲法が適用可能なことの証明
• 先ほどの貪欲アルゴリズムは左詰め。という
のも、同じ ID 内で、X 回増築の部分を採用し
ないで X+1 回増築の部分を採用しているなら、
代わりに X 回増築の部分を採用すればより
費用が下がる。
• 左詰めに採用されているのであれば、これは
今回の問題で実行可能。
• この値より下回る解は存在しないので、これ
が最適解となる。
満点解法に向けて
• この方針では 1 ≦ 𝐾 ≦ 100,000,000 という制
約に対して充分高速でない。
• 今までの手順をどうにかして高速化したい。
• 更に考察してみよう!
アプローチを変えてみる
• 貪欲法で最後に選んだ増築の費用を𝑉として
みる。
• 費用が𝑈の増築に対して、
• 𝑉 > 𝑈なら、その増築は必ず行われる。
• 𝑉 < 𝑈なら、その増築は決して行われない。
• 𝑉 = 𝑈なら、合計が𝐾回となる分だけ増築が
行われる。
満点解法
• 先ほどの𝑉を考えてみると、適当に𝑉′を定めたと
き、 𝑉′未満、 𝑉′より大きい、 𝑉′に等しい費用の増
築がそれぞれ何個あるかを計算すれば、𝑉と𝑉′
の大小関係が分かる。
• よって、 𝑉を二分探索することで計算することが
できる。
• 𝑉が分かれば、 𝑉未満の増築(𝑀個とする)をすべ
て採用し、 𝑉と等しい増築を𝐾 − 𝑀個採用すれ
ば最適解を計算できる。
• O(𝑁 log 𝐿) (𝐿は𝑉の上限) で計算できる。
• 100点が得られる。
D問題
だいたい最小全域木
D - 問題概要
問題

200 次元空間に 5 000 個の点がある。

2 点を結ぶコストを (1 - コサイン類似度) とするとき

できるだけコストの小さい全域木を求めよ。

最適なものの 1.01 倍のコストに収まれば OK。
D - 方針
普通にやると……

問題自体は最小全域木だが、

全点間のコストを計算するのは時間がかかりすぎる。
最小じゃなくてもいい!

「最適なものの 1.01 倍のコストに収まれば OK。」

だった!

→ 必要そうな 2 点間だけ計算するようにしたい
D - 2次元の場合
この問題が 2 次元空間の場合は……
←こんな感じで

グループ分けして
同じか、近いグループの

点たちだけ見る
D - 200 次元でも同じことを
・ランダムなベクトルを K 個用意する

・各点とランダムベクトルの内積が正か負かで

 K ビットのハッシュのようなものが計算できる

・このハッシュで近いものだけを考えることにする
ハッシュ同士はハミング距離(異なるビットの個数)

で距離を測れば爆速!!!!!
D - K の選び方
今回の場合は点がランダムに分布しているので
・点の i 番目の座標の値が正か負か
で 200 ビットのハッシュを作ると、

均等にグループ分けできて良いです。

More Related Content

What's hot

AtCoder Beginner Contest 003 解説
AtCoder Beginner Contest 003 解説AtCoder Beginner Contest 003 解説
AtCoder Beginner Contest 003 解説
AtCoder Inc.
 

What's hot (20)

AtCoder Beginner Contest 024 解説
AtCoder Beginner Contest 024 解説AtCoder Beginner Contest 024 解説
AtCoder Beginner Contest 024 解説
 
AtCoder Beginner Contest 029 解説
AtCoder Beginner Contest 029 解説AtCoder Beginner Contest 029 解説
AtCoder Beginner Contest 029 解説
 
AtCoder Regular Contest 020 解説
AtCoder Regular Contest 020 解説AtCoder Regular Contest 020 解説
AtCoder Regular Contest 020 解説
 
AtCoder Regular Contest 044 解説
AtCoder Regular Contest 044 解説AtCoder Regular Contest 044 解説
AtCoder Regular Contest 044 解説
 
AtCoder Regular Contest 017
AtCoder Regular Contest 017AtCoder Regular Contest 017
AtCoder Regular Contest 017
 
AtCoder Beginner Contest 006 解説
AtCoder Beginner Contest 006 解説AtCoder Beginner Contest 006 解説
AtCoder Beginner Contest 006 解説
 
AtCoder Regular Contest 002
AtCoder Regular Contest 002AtCoder Regular Contest 002
AtCoder Regular Contest 002
 
Arc041
Arc041Arc041
Arc041
 
AtCoder Beginner Contest 028 解説
AtCoder Beginner Contest 028 解説AtCoder Beginner Contest 028 解説
AtCoder Beginner Contest 028 解説
 
AtCoder Regular Contest 027 解説
AtCoder Regular Contest 027 解説AtCoder Regular Contest 027 解説
AtCoder Regular Contest 027 解説
 
AtCoder Regular Contest 034 解説
AtCoder Regular Contest 034 解説AtCoder Regular Contest 034 解説
AtCoder Regular Contest 034 解説
 
AtCoder Regular Contest 039 解説
AtCoder Regular Contest 039 解説AtCoder Regular Contest 039 解説
AtCoder Regular Contest 039 解説
 
AtCoder Regular Contest 048
AtCoder Regular Contest 048AtCoder Regular Contest 048
AtCoder Regular Contest 048
 
AtCoder Regular Contest 032 解説
AtCoder Regular Contest 032 解説AtCoder Regular Contest 032 解説
AtCoder Regular Contest 032 解説
 
AtCoder Beginner Contest 034 解説
AtCoder Beginner Contest 034 解説AtCoder Beginner Contest 034 解説
AtCoder Beginner Contest 034 解説
 
Disco Presents ディスカバリーチャンネルプログラミングコンテスト2016 本選 解説
Disco Presents ディスカバリーチャンネルプログラミングコンテスト2016 本選 解説Disco Presents ディスカバリーチャンネルプログラミングコンテスト2016 本選 解説
Disco Presents ディスカバリーチャンネルプログラミングコンテスト2016 本選 解説
 
AtCoder Beginner Contest 020 解説
AtCoder Beginner Contest 020 解説AtCoder Beginner Contest 020 解説
AtCoder Beginner Contest 020 解説
 
AtCoder Beginner Contest 003 解説
AtCoder Beginner Contest 003 解説AtCoder Beginner Contest 003 解説
AtCoder Beginner Contest 003 解説
 
Abc009
Abc009Abc009
Abc009
 
AtCoder Beginner Contest 021 解説
AtCoder Beginner Contest 021 解説AtCoder Beginner Contest 021 解説
AtCoder Beginner Contest 021 解説
 

Viewers also liked

機械学習とその理論 (情報オリンピック2015春合宿講義資料)
機械学習とその理論 (情報オリンピック2015春合宿講義資料)機械学習とその理論 (情報オリンピック2015春合宿講義資料)
機械学習とその理論 (情報オリンピック2015春合宿講義資料)
irrrrr
 

Viewers also liked (11)

AtCoder Regular Contest 022 解説
AtCoder Regular Contest 022 解説AtCoder Regular Contest 022 解説
AtCoder Regular Contest 022 解説
 
ω Automaton
ω Automatonω Automaton
ω Automaton
 
AtCoder Regular Contest 025 解説
AtCoder Regular Contest 025 解説AtCoder Regular Contest 025 解説
AtCoder Regular Contest 025 解説
 
AtCoder Regular Contest 031 解説
AtCoder Regular Contest 031 解説AtCoder Regular Contest 031 解説
AtCoder Regular Contest 031 解説
 
AtCoder Regular Contest 024 解説
AtCoder Regular Contest 024 解説AtCoder Regular Contest 024 解説
AtCoder Regular Contest 024 解説
 
AtCoder Regular Contest 023 解説
AtCoder Regular Contest 023 解説AtCoder Regular Contest 023 解説
AtCoder Regular Contest 023 解説
 
正規言語と代数と論理の対応:An Introduction to Eilenberg’s Variety Theorem
正規言語と代数と論理の対応:An Introduction to Eilenberg’s Variety Theorem正規言語と代数と論理の対応:An Introduction to Eilenberg’s Variety Theorem
正規言語と代数と論理の対応:An Introduction to Eilenberg’s Variety Theorem
 
AtCoder Regular Contest 016 解説
AtCoder Regular Contest 016 解説AtCoder Regular Contest 016 解説
AtCoder Regular Contest 016 解説
 
機械学習とその理論 (情報オリンピック2015春合宿講義資料)
機械学習とその理論 (情報オリンピック2015春合宿講義資料)機械学習とその理論 (情報オリンピック2015春合宿講義資料)
機械学習とその理論 (情報オリンピック2015春合宿講義資料)
 
AtCoder Regular Contest 049 解説
AtCoder Regular Contest 049 解説AtCoder Regular Contest 049 解説
AtCoder Regular Contest 049 解説
 
AtCoder Regular Contest 001
AtCoder Regular Contest 001AtCoder Regular Contest 001
AtCoder Regular Contest 001
 

Similar to AtCoder Regular Contest 021 解説

2011年11月11日
2011年11月11日2011年11月11日
2011年11月11日
nukaemon
 
Kth
KthKth
Kth
oupc
 

Similar to AtCoder Regular Contest 021 解説 (20)

AtCoder Beginner Contest 018 解説
AtCoder Beginner Contest 018 解説AtCoder Beginner Contest 018 解説
AtCoder Beginner Contest 018 解説
 
日本情報オリンピック旗(JOI Flag) 解説
日本情報オリンピック旗(JOI Flag) 解説日本情報オリンピック旗(JOI Flag) 解説
日本情報オリンピック旗(JOI Flag) 解説
 
AtCoder Beginner Contest 008 解説
AtCoder Beginner Contest 008 解説AtCoder Beginner Contest 008 解説
AtCoder Beginner Contest 008 解説
 
AtCoder Beginner Contest 035 解説
AtCoder Beginner Contest 035 解説AtCoder Beginner Contest 035 解説
AtCoder Beginner Contest 035 解説
 
CODE FESTIVAL 2014 エキシビジョン 解説
CODE FESTIVAL 2014 エキシビジョン 解説CODE FESTIVAL 2014 エキシビジョン 解説
CODE FESTIVAL 2014 エキシビジョン 解説
 
2011年11月11日
2011年11月11日2011年11月11日
2011年11月11日
 
Aizu-2017: B
Aizu-2017: BAizu-2017: B
Aizu-2017: B
 
AtCoder Regular Contest 019 解説
AtCoder Regular Contest 019 解説AtCoder Regular Contest 019 解説
AtCoder Regular Contest 019 解説
 
Binary indexed tree
Binary indexed treeBinary indexed tree
Binary indexed tree
 
Kth
KthKth
Kth
 
DDPC 2016 予選 解説
DDPC 2016 予選 解説DDPC 2016 予選 解説
DDPC 2016 予選 解説
 
Introduction to programming
Introduction to programmingIntroduction to programming
Introduction to programming
 
CODE FESTIVAL 2015 予選B 解説
CODE FESTIVAL 2015 予選B 解説CODE FESTIVAL 2015 予選B 解説
CODE FESTIVAL 2015 予選B 解説
 
CODE THANKS FESTIVAL 2014 A日程 解説
CODE THANKS FESTIVAL 2014 A日程 解説CODE THANKS FESTIVAL 2014 A日程 解説
CODE THANKS FESTIVAL 2014 A日程 解説
 
Code Formula 予選B 解説
Code Formula 予選B 解説Code Formula 予選B 解説
Code Formula 予選B 解説
 
ウェーブレット木の世界
ウェーブレット木の世界ウェーブレット木の世界
ウェーブレット木の世界
 
AtCoder Regular Contest 046
AtCoder Regular Contest 046AtCoder Regular Contest 046
AtCoder Regular Contest 046
 
AtCoder Beginner Contest 009 解説
AtCoder Beginner Contest 009 解説AtCoder Beginner Contest 009 解説
AtCoder Beginner Contest 009 解説
 
AtCoder Beginner Contest 023 解説
AtCoder Beginner Contest 023 解説AtCoder Beginner Contest 023 解説
AtCoder Beginner Contest 023 解説
 
著者:結城 浩-『プログラマの数学』の第8章をスライド資料にしたもの
著者:結城 浩-『プログラマの数学』の第8章をスライド資料にしたもの著者:結城 浩-『プログラマの数学』の第8章をスライド資料にしたもの
著者:結城 浩-『プログラマの数学』の第8章をスライド資料にしたもの
 

More from AtCoder Inc.

More from AtCoder Inc. (18)

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
 
MUJINプログラミングチャレンジ2016 解説
MUJINプログラミングチャレンジ2016 解説MUJINプログラミングチャレンジ2016 解説
MUJINプログラミングチャレンジ2016 解説
 
AtCoder Beginner Contest 033 解説
AtCoder Beginner Contest 033 解説AtCoder Beginner Contest 033 解説
AtCoder Beginner Contest 033 解説
 
arc047
arc047arc047
arc047
 
abc032
abc032abc032
abc032
 
CODE FESTIVAL 2015 沖縄ツアー 解説
CODE FESTIVAL 2015 沖縄ツアー 解説CODE FESTIVAL 2015 沖縄ツアー 解説
CODE FESTIVAL 2015 沖縄ツアー 解説
 
abc031
abc031abc031
abc031
 
CODE FESTIVAL 2015 解説
CODE FESTIVAL 2015 解説CODE FESTIVAL 2015 解説
CODE FESTIVAL 2015 解説
 
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 解説
 
天下一プログラマーコンテスト2015 予選B 解説
天下一プログラマーコンテスト2015 予選B 解説天下一プログラマーコンテスト2015 予選B 解説
天下一プログラマーコンテスト2015 予選B 解説
 
AtCoder Regular Contest 043 解説
AtCoder Regular Contest 043 解説AtCoder Regular Contest 043 解説
AtCoder Regular Contest 043 解説
 
天下一プログラマーコンテスト2015 予選A E問題 解説
天下一プログラマーコンテスト2015 予選A E問題 解説天下一プログラマーコンテスト2015 予選A E問題 解説
天下一プログラマーコンテスト2015 予選A E問題 解説
 
AtCoder Regular Contest 042 解説
AtCoder Regular Contest 042 解説AtCoder Regular Contest 042 解説
AtCoder Regular Contest 042 解説
 

AtCoder Regular Contest 021 解説