SlideShare uma empresa Scribd logo
1 de 16
Baixar para ler offline
各種問題の解説 
@dp_zirk, tozangezan, wolf_sothe
なぜこんなスライドを作ったか 
● 生徒だけがスライドを作って大変な思いをしている 
のに、チューターだけ楽してたらアレですよねぇ… 
● TopCoderのDiv1Hardの問題を簡潔に解説してい 
きます。 
● これらはすべて夏季セミナー中に解いたものです。
Ambigram (SRM183 Hard) 
● 問題概要: 自分で調べてください。空文字列が 
Ambigramでないのがめんどい要素。 
● 解法: 区間DP。 
● 長さ1,2のときは別に処理したほうが良い。 
● あと、1文字以上つかったかどうかも持っておく。
Scheduling (SRM165 Hard) 
● 問題概要: 自分で調べてください。 
● 解法: 
● 実は状態量がかなりすくない。(4096*100くらい) 
● priority_queueで全探索すれば大丈夫。 
● DFSしたらTLEした。
Roxor (SRM216 Hard) 
● 問題概要: 自分で調べてください。ゲーム系。 
● 解法: 
● 実はそれぞれの山の偶奇だけを考えればよい(相 
手と同じことをすれば2個減るだけ) 
● また、奇数個ある山から取るだけでよい(偶数個の 
ところを取っても自分の番に2つ減るだけで変化が 
ない) 
● あとはbitDP
SwapSorter (SRM 279 Hard) 
● 問題概要: 自分で調べてください。 
● 解法: Ad-hoc 
● そろってないところに書いてある数字とそれの正し 
い位置でUnion-Findして(頂点は位置ではなく数 
字)連結成分ごとに考える。 
● 連結成分の大きさが2のときはsize/2回、 
● そうでないときはsize-1回swapすることができる。
PolyominoCut (SRM 242 Hard) 
● 問題概要: 自分で調べてください。 
● 解法: やるだけ 
● まず穴のないk-ominoを全列挙する。 
● それぞれについてそのk-ominoが内部にある、辺 
に接する、角に接するものを考えて掛け算や足し 
算で上手く計算する。 
● 穴判定、辺に接することが可能かの判定はBFSす 
ればよい。角判定は2辺で可能で(k-ominoを含む 
最小長方形の最も上,最も左)にブロックがあれば 
よい。
MergingGraph (SRM 321 Hard) 
● 問題概要: 自分で調べてください。 
● 解法: 
● まず、マージできなくなるまで、Union-Findを使って 
i->k, j->kの辺があるときに(i,j)をマージ、を繰り返 
す。しっかりUnion-Findを活用しないと元は違う頂 
点だが今マージされて同じ頂点が行き先のとき間 
違える。あと、k->i, k->jも同じようにやる。 
● こうしてできたものは孤立点と直線グラフとルー 
プ。ループの大きさは今ループがあるならそれらの 
大きさのgcd、ないなら直線グラフを全部つなげる。
BeautifulHexagonalTilings 
(SRM 355 Hard) 
● 問題概要: 自分で調べてください。 
● 解法: 答えの数がかなり少ない。 
● 全探索 or bitDP 
● 全探索した。 
● TLEした。 
● ループ減らして3倍くらい定数倍改善した。 
● 通った。 
● あのさぁ……。
PresentationComp (SRM 221 Hard) 
● 問題概要: 自分で調べてください。 
● 解法: 
● 次のような不変量がある。 
● (xの個数 mod 8)*6+((偶数個目のxの右にあるyの 
個数)-(奇数個目の右にあるyの個数) mod 6) 
● 答えの長さは短いので全探索してこの不変量を比 
べる。
ColorfulBoard (SRM 517 Hard) 
● 問題概要: 自分で調べてください。rng_58さん作。 
● 解法: 
● 塗られない行または列が存在する(全部塗ると仮 
定すると一番最初に塗られた行or列が意味をなさ 
なくて無駄) 
● それを全部についてためし、その行と違う色のとこ 
ろが分かれば列に塗ったいろが分かる。あと塗る 
順序(i行とj列どっちが早いか)がわかる。これでグ 
ラフをつくって閉路を探す。あれば矛盾。 
● 矛盾がなければ使う個数は簡単にわかる。
CountryWar (SRM 288 Hard) 
● 問題概要: 自分で調べてください。 
● 解法: bitDP。 
● 結構計算量が重くなってしまって削るのが大変。 
● しかも結局定数倍改善した。 
● 答えが10-65くらいになることがあるので、最初に明 
らかに答えが10-9よりも小さくてどうでもいいケース 
は0を返した。
RandomApple (SRM 478 Hard) 
● 問題概要: 自分で調べてください。rng_58さん作。 
● 解法: 
● i個目の箱を選んだときにりんごの数の合計がk個 
となるほかの箱の選び方が何通りあるかDPで求 
める(long longに収まる)。これは1回O(NK)。 
● しかし↑はまとめて計算できる。iごとに引き算して 
あわせてO(NK)ですませられる。 
● そこからkそれぞれについて箱iの重みが分かり、そ 
の箱の中からりんごjを引く確率にその値をかけれ 
ば全体で箱iの中のりんごjを引く確率が分かる。
CurvyonRails (SRM 570 Hard) 
● 問題概要: 自分で調べてください。snuke作。 
● 解法: snukeに聞いてください。 
● ループを複数作る系は最小費用流が有効。 
● これに流す。
TheXGame (SRM 304 Hard) 
● 問題概要: 自分で調べてください。ゲーム系。 
● 解法: 数 学 オ リ ン ピ ッ ク 
● 帰納法で普通のNimと同様であることが証明でき 
る。 
● 普通に数学オリンピックで強い人じゃないと気がつ 
かないと思う。 
● 証明の仕方が妙に数学オリンピックにありそう。 
● 証明できたらあとはやるだけ。
TransformMatrix (SRM 407 Hard) 
● 問題概要: 自分で調べてください。 
● 解法: どうせ最小費用流。 
● 今回のグラフでは、可能かどうか判定するための 
容量制限のところと、コストを求めるためのコスト部 
分は違う辺にあるというのが気づきにくい。 
● 各頂点について使える回数/2+(スタートの数字)+ 
(ゴールの数字)が頂点容量。 
● あとは移動先にコスト1容量∞の辺を張る。 
● 88方向に移動可能であることに注意!!!!

Mais conteúdo relacionado

Destaque

ICPC2014 チーム紹介スライド !#$%&()*+-./:;<=>?@[\]^_`{|}~
ICPC2014 チーム紹介スライド !#$%&()*+-./:;<=>?@[\]^_`{|}~ICPC2014 チーム紹介スライド !#$%&()*+-./:;<=>?@[\]^_`{|}~
ICPC2014 チーム紹介スライド !#$%&()*+-./:;<=>?@[\]^_`{|}~Kensuke Imanishi
 
MUJINプログラミングチャレンジ2016 解説
MUJINプログラミングチャレンジ2016 解説MUJINプログラミングチャレンジ2016 解説
MUJINプログラミングチャレンジ2016 解説AtCoder Inc.
 
実践・最強最速のアルゴリズム勉強会 第三回講義資料(ワークスアプリケーションズ & AtCoder)
実践・最強最速のアルゴリズム勉強会 第三回講義資料(ワークスアプリケーションズ & AtCoder)実践・最強最速のアルゴリズム勉強会 第三回講義資料(ワークスアプリケーションズ & AtCoder)
実践・最強最速のアルゴリズム勉強会 第三回講義資料(ワークスアプリケーションズ & AtCoder)AtCoder Inc.
 
様々な全域木問題
様々な全域木問題様々な全域木問題
様々な全域木問題tmaehara
 
高速フーリエ変換
高速フーリエ変換高速フーリエ変換
高速フーリエ変換AtCoder Inc.
 
アルゴリズムイントロダクション15章 動的計画法
アルゴリズムイントロダクション15章 動的計画法アルゴリズムイントロダクション15章 動的計画法
アルゴリズムイントロダクション15章 動的計画法nitoyon
 
DDPC 2016 予選 解説
DDPC 2016 予選 解説DDPC 2016 予選 解説
DDPC 2016 予選 解説AtCoder Inc.
 

Destaque (8)

ICPC2014 チーム紹介スライド !#$%&()*+-./:;<=>?@[\]^_`{|}~
ICPC2014 チーム紹介スライド !#$%&()*+-./:;<=>?@[\]^_`{|}~ICPC2014 チーム紹介スライド !#$%&()*+-./:;<=>?@[\]^_`{|}~
ICPC2014 チーム紹介スライド !#$%&()*+-./:;<=>?@[\]^_`{|}~
 
目指せグラフマスター
目指せグラフマスター目指せグラフマスター
目指せグラフマスター
 
MUJINプログラミングチャレンジ2016 解説
MUJINプログラミングチャレンジ2016 解説MUJINプログラミングチャレンジ2016 解説
MUJINプログラミングチャレンジ2016 解説
 
実践・最強最速のアルゴリズム勉強会 第三回講義資料(ワークスアプリケーションズ & AtCoder)
実践・最強最速のアルゴリズム勉強会 第三回講義資料(ワークスアプリケーションズ & AtCoder)実践・最強最速のアルゴリズム勉強会 第三回講義資料(ワークスアプリケーションズ & AtCoder)
実践・最強最速のアルゴリズム勉強会 第三回講義資料(ワークスアプリケーションズ & AtCoder)
 
様々な全域木問題
様々な全域木問題様々な全域木問題
様々な全域木問題
 
高速フーリエ変換
高速フーリエ変換高速フーリエ変換
高速フーリエ変換
 
アルゴリズムイントロダクション15章 動的計画法
アルゴリズムイントロダクション15章 動的計画法アルゴリズムイントロダクション15章 動的計画法
アルゴリズムイントロダクション15章 動的計画法
 
DDPC 2016 予選 解説
DDPC 2016 予選 解説DDPC 2016 予選 解説
DDPC 2016 予選 解説
 

各種問題の解説

  • 2. なぜこんなスライドを作ったか ● 生徒だけがスライドを作って大変な思いをしている のに、チューターだけ楽してたらアレですよねぇ… ● TopCoderのDiv1Hardの問題を簡潔に解説してい きます。 ● これらはすべて夏季セミナー中に解いたものです。
  • 3. Ambigram (SRM183 Hard) ● 問題概要: 自分で調べてください。空文字列が Ambigramでないのがめんどい要素。 ● 解法: 区間DP。 ● 長さ1,2のときは別に処理したほうが良い。 ● あと、1文字以上つかったかどうかも持っておく。
  • 4. Scheduling (SRM165 Hard) ● 問題概要: 自分で調べてください。 ● 解法: ● 実は状態量がかなりすくない。(4096*100くらい) ● priority_queueで全探索すれば大丈夫。 ● DFSしたらTLEした。
  • 5. Roxor (SRM216 Hard) ● 問題概要: 自分で調べてください。ゲーム系。 ● 解法: ● 実はそれぞれの山の偶奇だけを考えればよい(相 手と同じことをすれば2個減るだけ) ● また、奇数個ある山から取るだけでよい(偶数個の ところを取っても自分の番に2つ減るだけで変化が ない) ● あとはbitDP
  • 6. SwapSorter (SRM 279 Hard) ● 問題概要: 自分で調べてください。 ● 解法: Ad-hoc ● そろってないところに書いてある数字とそれの正し い位置でUnion-Findして(頂点は位置ではなく数 字)連結成分ごとに考える。 ● 連結成分の大きさが2のときはsize/2回、 ● そうでないときはsize-1回swapすることができる。
  • 7. PolyominoCut (SRM 242 Hard) ● 問題概要: 自分で調べてください。 ● 解法: やるだけ ● まず穴のないk-ominoを全列挙する。 ● それぞれについてそのk-ominoが内部にある、辺 に接する、角に接するものを考えて掛け算や足し 算で上手く計算する。 ● 穴判定、辺に接することが可能かの判定はBFSす ればよい。角判定は2辺で可能で(k-ominoを含む 最小長方形の最も上,最も左)にブロックがあれば よい。
  • 8. MergingGraph (SRM 321 Hard) ● 問題概要: 自分で調べてください。 ● 解法: ● まず、マージできなくなるまで、Union-Findを使って i->k, j->kの辺があるときに(i,j)をマージ、を繰り返 す。しっかりUnion-Findを活用しないと元は違う頂 点だが今マージされて同じ頂点が行き先のとき間 違える。あと、k->i, k->jも同じようにやる。 ● こうしてできたものは孤立点と直線グラフとルー プ。ループの大きさは今ループがあるならそれらの 大きさのgcd、ないなら直線グラフを全部つなげる。
  • 9. BeautifulHexagonalTilings (SRM 355 Hard) ● 問題概要: 自分で調べてください。 ● 解法: 答えの数がかなり少ない。 ● 全探索 or bitDP ● 全探索した。 ● TLEした。 ● ループ減らして3倍くらい定数倍改善した。 ● 通った。 ● あのさぁ……。
  • 10. PresentationComp (SRM 221 Hard) ● 問題概要: 自分で調べてください。 ● 解法: ● 次のような不変量がある。 ● (xの個数 mod 8)*6+((偶数個目のxの右にあるyの 個数)-(奇数個目の右にあるyの個数) mod 6) ● 答えの長さは短いので全探索してこの不変量を比 べる。
  • 11. ColorfulBoard (SRM 517 Hard) ● 問題概要: 自分で調べてください。rng_58さん作。 ● 解法: ● 塗られない行または列が存在する(全部塗ると仮 定すると一番最初に塗られた行or列が意味をなさ なくて無駄) ● それを全部についてためし、その行と違う色のとこ ろが分かれば列に塗ったいろが分かる。あと塗る 順序(i行とj列どっちが早いか)がわかる。これでグ ラフをつくって閉路を探す。あれば矛盾。 ● 矛盾がなければ使う個数は簡単にわかる。
  • 12. CountryWar (SRM 288 Hard) ● 問題概要: 自分で調べてください。 ● 解法: bitDP。 ● 結構計算量が重くなってしまって削るのが大変。 ● しかも結局定数倍改善した。 ● 答えが10-65くらいになることがあるので、最初に明 らかに答えが10-9よりも小さくてどうでもいいケース は0を返した。
  • 13. RandomApple (SRM 478 Hard) ● 問題概要: 自分で調べてください。rng_58さん作。 ● 解法: ● i個目の箱を選んだときにりんごの数の合計がk個 となるほかの箱の選び方が何通りあるかDPで求 める(long longに収まる)。これは1回O(NK)。 ● しかし↑はまとめて計算できる。iごとに引き算して あわせてO(NK)ですませられる。 ● そこからkそれぞれについて箱iの重みが分かり、そ の箱の中からりんごjを引く確率にその値をかけれ ば全体で箱iの中のりんごjを引く確率が分かる。
  • 14. CurvyonRails (SRM 570 Hard) ● 問題概要: 自分で調べてください。snuke作。 ● 解法: snukeに聞いてください。 ● ループを複数作る系は最小費用流が有効。 ● これに流す。
  • 15. TheXGame (SRM 304 Hard) ● 問題概要: 自分で調べてください。ゲーム系。 ● 解法: 数 学 オ リ ン ピ ッ ク ● 帰納法で普通のNimと同様であることが証明でき る。 ● 普通に数学オリンピックで強い人じゃないと気がつ かないと思う。 ● 証明の仕方が妙に数学オリンピックにありそう。 ● 証明できたらあとはやるだけ。
  • 16. TransformMatrix (SRM 407 Hard) ● 問題概要: 自分で調べてください。 ● 解法: どうせ最小費用流。 ● 今回のグラフでは、可能かどうか判定するための 容量制限のところと、コストを求めるためのコスト部 分は違う辺にあるというのが気づきにくい。 ● 各頂点について使える回数/2+(スタートの数字)+ (ゴールの数字)が頂点容量。 ● あとは移動先にコスト1容量∞の辺を張る。 ● 88方向に移動可能であることに注意!!!!