SlideShare uma empresa Scribd logo
1 de 22
Baixar para ler offline
AtCoder Regular Contest 032
解説
AtCoder株式会社 代表取締役
高橋 直大
2015/1/3 1
競技プログラミングを始める前に
• 競技プログラミングをやったことがない人へ
– まずはこっちのスライドを見よう!
– http://www.slideshare.net/chokudai/abc004
2015/1/3 2
©AtCoder Inc. All rights reserved. 3
A問題 ホリドッグ
1. 問題概要
2. アルゴリズム
2015/1/3 3
A問題 問題概要
• Nが与えられる
• 1+2+…+Nの素数判定せよ
• 制約
– 1 ≦ N ≦ 999
2015/1/3 4
A問題 アルゴリズム
• 解法1
– S=1+2+…+Nをforループで計算する
• N=1000のとき最大でS=1+2+…+1000 = 500500
– それに対して素数判定をforループで行う
• 2~S-1の範囲でSを割り切る数がないか確かめる
• 解法2
– S=1+2+…+N=
𝑁 𝑁+1
2
(総和の公式)
• 式から明らかにNが小さいとき以外は素数にならなさそう
– N=1のときは1なので素数ではない
– N=2のときは素数
– N>2のとき常に合成数
• N=2のときだけ素数,それ以外のとき非素数なので,
その事実にしたがって出力すればよい
2015/1/3 5
©AtCoder Inc. All rights reserved. 6
B問題 道路工事
1. 問題概要
2. アルゴリズム
2015/1/3 6
B問題 問題概要
• N 頂点 M 辺の無向グラフが与えられる
• グラフに最小でいくつ辺を追加すれば、全体がつな
がるか調べる
• 制約
– 0 ≦ N,M ≦ 100000
2015/1/3 7
B問題 アルゴリズム
• 考察
– グラフのつながっている部分がK個あるとき、最小でK-1本
の辺があれば全体をつなげられる。
– 1本つながっていない部分の間に辺を追加すると、Kは1減
るから。
2015/1/3 8
黒がもともとある道路
このとき、K=3
2本の赤の辺を追加すれば全
体がつながる
B問題 アルゴリズム
• なので、グラフのつながっている部分(連結成分と呼
ばれる)の数を数えればよい。
• 解法1
– Union-Findですべての辺をつないだ後、Union-Find木での
root の数を数える(具体的には、頂点 v のrootが v のもの
を数えると楽。連結成分ごとに root は共通で、自身が
root となるものがちょうど 1 つあるから)
• 解法2
– 今まででまだ訪れていない頂点を見つけたら、 DFSを使い
そこから行ける頂点をすべて訪れて、連結成分の数を1つ
加える etc…
• どちらも(ほぼ)線形時間
2015/1/3 9
©AtCoder Inc. All rights reserved. 10
C問題 仕事計画
1. 問題概要
2. アルゴリズム
2015/1/3 10
C問題 問題概要
• 時刻の区間がN個与えられます。区間は順に1から
Nまで番号付けられています。
• i 番目の区間は a_i から b_i まで。
• 互いに被らない条件の下で、なるべく多くの区間を
選びたい(端点は被ってもOK)
• 複数あるときは、区間の早い順に並べた時の辞書
順最小となるものを1つ出力。
• 制約
– 0 ≦ a_i, b_i ≦ 1000000
– 1 ≦ N ≦ 100000
2015/1/3 11
C問題 アルゴリズム
• これ蟻本でやったやつだ!(区間スケジューリング問
題, p43)
– 蟻本を読もう!
– 具体的には、終了時間が早い順にソートし、貪欲に区間
を選んで行けば、区間数最大の解が1つ得られる
• しかし、辞書順最小での構成を1つ出力しなければ
ならない
• なるべく多く取れる取り方のうち、辞書順最小のもの
を求めるときは、最初に取れるものを最小化し続け
る必要がある
2015/1/3 12
C問題 アルゴリズム
• 時刻 i それぞれに対し、(i 以降で最大でいくつ取れ
るか?,最大の取り方のうち、次に取れる最小の仕事
の番号はいくつか?) のペアが更新すればできそう
– i から始めるとき、次に取る区間は辞書順最小の条件か
ら、(最大の取り方のうち、次に取れる最小の仕事の番号)
となるから
• このペアを dp[i] とおく
2015/1/3 13
C問題 アルゴリズム
• dp[i] を求めるとき、
– 時刻 i から始まる区間を使うとき、時刻 i から始まり、b で終わ
る番号idの区間を使う場合、 (b以降で取れる区間の最大数
+1,id) が候補
– 時刻 i から始まる区間を使わないとき、(時刻 i+1 以降で取れる
区間の最大数, そのうちの最小の仕事の番号) が候補
– 以上のペアから、取れる区間の最大数で比較し、多いものを選
ぶ。それが同じなら、次に取る仕事の番号が小さいものを選ぶ。
• 番号が同じ区間はないので、このペアが同じになることは無い
• 以上のことから、dp[i] の更新に必要なのは i+1 以降の
dpの情報
• よって、dp[i] を後ろから更新していけばよい
2015/1/3 14
C問題 アルゴリズム
• dp[0] が求まったら、0 以降で取れる区間の最大数
が1つ目の答え。
• 復元するときは、今の時刻以降で最大の取り方のう
ち最小の番号の区間をとり続けていく
– dp のペアの2番目の情報にこれがそのまま入っている
– 最初に “今の時刻”=0 とし、次に取る区間を答えに追加
し、”今の時刻”を最後に取った区間の終端に更新
– これを、取れる区間が無くなるまで繰り返す
• 合計でもO(N)!
2015/1/3 15
©AtCoder Inc. All rights reserved. 16
D問題 アットコーダーモンスターズ
1. 問題概要
2. 考察
3. アルゴリズム
2015/1/3 16
D問題 問題概要
• N匹のモンスターがいる
• 各モンスターには攻撃力と防御力というパラメータがある
• ちょうどK匹のモンスターを買いたい
• あるモンスターの対について,攻撃力の差と防御力の差の
最大値を不安定度と定義
• K匹からなるチームに含まれるペアの不安定度の最大値
(=チームの不安定度)を最小化し,それを達成する組み合わ
せ数 mod 100000007 を出力しろ.
• 制約
– 1 ≦ K ≦ N ≦ 100,000
– 0 ≦ 各モンスターの防御力,攻撃力 ≦ 3000
2015/1/3 17
D問題 考察
• まず,チームの不安定度の最小値を求めたい.
• モンスターの(攻撃力,防御力)を二次元平面に点とし
てプロットしてみる
• あるチームの不安定度をxと決めたとき,
– 一辺xの正方形領域に含まれる点の数がK以上であるようなところ
が存在すれば,不安定度x以下にできることが分かる.
• これで二分探索したらよさそう.
• 任意の正方形領域に含まれる点の数を高速に計算
するため,予め二次元累積和を計算しておく.
D問題 考察
• 次にチームの不安定度の最小値mを達成する組み
合わせ数を求めたい.
• 単純に全ての領域に対してKコを選ぶ組み合わせの
数を計算するのは,重複が発生しダメ.
• ある点を角(x,y)と決めたときに,その点を角にした
正方形(左上(x,y)右下(x+m,y+m))のときにしか達成
できないような選び方を計算することで重複なく数え
られる
• そのような選び方は2パターンある(次スライド)
D問題 考察
• パターン1 : 選んだ角(x,y)に1つ以上の点がある
• パターン2 : 選んだ角(x,y)に点は無いが,(x,?)と(?,y)
に1つ以上ずつ点がある.
ケース1(3通り) ケース2(1通り)
↑4つの点がある適当な例(K=3とする)
D問題 考察
• 説明のために
– 正方形領域の全ての点の数をall
– 角(x,y)の点をcorner
– 左端領域の点と上端領域の点の数をleft,top
と表す
[パターン1の個数]
– nCr(all,K) - nCr(all-corner,K)
[パターン2の個数]
– nCr(number-corner,K)
- nCr(number-corner-top,K)
- ncr(number-corner-left,K)
+ nCr(number-corner-(top+left),K)
corner以外でKコ
cornerとtop以外でKコ
cornerとleft以外でKコ
cornerとleftとtop以外でKコ
(引きすぎた分を足す,包除原理)
D問題 アルゴリズム
• モンスターのパラメータの最大値をM(<=3000)とする
• Nコの点をプロットする → O(N)
• 二次元累積和を計算しておく → O(M^2)
• チームの不安定度の最小値mを二分探索で求める
→ 累積和を用いて O(M^2 log M)
• 組み合わせ数を求める
→ O(M^2)
nCrの計算は予め0≦k≦Nについてk!と(k!の逆元)をmod 10^9+7で計算しておく
ことでO(1)
• 全体として O(M^2 log M)

Mais conteúdo relacionado

Mais procurados

AtCoder Beginner Contest 020 解説
AtCoder Beginner Contest 020 解説AtCoder Beginner Contest 020 解説
AtCoder Beginner Contest 020 解説AtCoder Inc.
 
AtCoder Beginner Contest 006 解説
AtCoder Beginner Contest 006 解説AtCoder Beginner Contest 006 解説
AtCoder Beginner Contest 006 解説AtCoder Inc.
 
AtCoder Regular Contest 049 解説
AtCoder Regular Contest 049 解説AtCoder Regular Contest 049 解説
AtCoder Regular Contest 049 解説AtCoder Inc.
 
AtCoder Regular Contest 029 解説
AtCoder Regular Contest 029 解説AtCoder Regular Contest 029 解説
AtCoder Regular Contest 029 解説AtCoder Inc.
 
DDPC 2016 予選 解説
DDPC 2016 予選 解説DDPC 2016 予選 解説
DDPC 2016 予選 解説AtCoder Inc.
 
AtCoder Beginner Contest 024 解説
AtCoder Beginner Contest 024 解説AtCoder Beginner Contest 024 解説
AtCoder Beginner Contest 024 解説AtCoder Inc.
 
AtCoder Regular Contest 016 解説
AtCoder Regular Contest 016 解説AtCoder Regular Contest 016 解説
AtCoder Regular Contest 016 解説AtCoder Inc.
 
AtCoder Beginner Contest 011 解説
AtCoder Beginner Contest 011 解説AtCoder Beginner Contest 011 解説
AtCoder Beginner Contest 011 解説AtCoder Inc.
 
AtCoder Beginner Contest 022 解説
AtCoder Beginner Contest 022 解説AtCoder Beginner Contest 022 解説
AtCoder Beginner Contest 022 解説AtCoder Inc.
 
AtCoder Regular Contest 019 解説
AtCoder Regular Contest 019 解説AtCoder Regular Contest 019 解説
AtCoder Regular Contest 019 解説AtCoder Inc.
 
AtCoder Regular Contest 027 解説
AtCoder Regular Contest 027 解説AtCoder Regular Contest 027 解説
AtCoder Regular Contest 027 解説AtCoder Inc.
 
AtCoder Regular Contest 023 解説
AtCoder Regular Contest 023 解説AtCoder Regular Contest 023 解説
AtCoder Regular Contest 023 解説AtCoder Inc.
 
AtCoder Regular Contest 036 解説
AtCoder Regular Contest 036 解説AtCoder Regular Contest 036 解説
AtCoder Regular Contest 036 解説AtCoder Inc.
 
AtCoder Beginner Contest 026 解説
AtCoder Beginner Contest 026 解説AtCoder Beginner Contest 026 解説
AtCoder Beginner Contest 026 解説AtCoder Inc.
 
AtCoder Beginner Contest 033 解説
AtCoder Beginner Contest 033 解説AtCoder Beginner Contest 033 解説
AtCoder Beginner Contest 033 解説AtCoder Inc.
 
AtCoder Beginner Contest 014 解説
AtCoder Beginner Contest 014 解説AtCoder Beginner Contest 014 解説
AtCoder Beginner Contest 014 解説AtCoder Inc.
 
AtCoder Beginner Contest 021 解説
AtCoder Beginner Contest 021 解説AtCoder Beginner Contest 021 解説
AtCoder Beginner Contest 021 解説AtCoder Inc.
 
AtCoder Beginner Contest 017 解説
AtCoder Beginner Contest 017 解説AtCoder Beginner Contest 017 解説
AtCoder Beginner Contest 017 解説AtCoder Inc.
 

Mais procurados (20)

AtCoder Beginner Contest 020 解説
AtCoder Beginner Contest 020 解説AtCoder Beginner Contest 020 解説
AtCoder Beginner Contest 020 解説
 
AtCoder Beginner Contest 006 解説
AtCoder Beginner Contest 006 解説AtCoder Beginner Contest 006 解説
AtCoder Beginner Contest 006 解説
 
AtCoder Regular Contest 049 解説
AtCoder Regular Contest 049 解説AtCoder Regular Contest 049 解説
AtCoder Regular Contest 049 解説
 
AtCoder Regular Contest 029 解説
AtCoder Regular Contest 029 解説AtCoder Regular Contest 029 解説
AtCoder Regular Contest 029 解説
 
DDPC 2016 予選 解説
DDPC 2016 予選 解説DDPC 2016 予選 解説
DDPC 2016 予選 解説
 
Arc041
Arc041Arc041
Arc041
 
AtCoder Beginner Contest 024 解説
AtCoder Beginner Contest 024 解説AtCoder Beginner Contest 024 解説
AtCoder Beginner Contest 024 解説
 
AtCoder Regular Contest 016 解説
AtCoder Regular Contest 016 解説AtCoder Regular Contest 016 解説
AtCoder Regular Contest 016 解説
 
AtCoder Beginner Contest 011 解説
AtCoder Beginner Contest 011 解説AtCoder Beginner Contest 011 解説
AtCoder Beginner Contest 011 解説
 
AtCoder Beginner Contest 022 解説
AtCoder Beginner Contest 022 解説AtCoder Beginner Contest 022 解説
AtCoder Beginner Contest 022 解説
 
AtCoder Regular Contest 019 解説
AtCoder Regular Contest 019 解説AtCoder Regular Contest 019 解説
AtCoder Regular Contest 019 解説
 
Abc009
Abc009Abc009
Abc009
 
AtCoder Regular Contest 027 解説
AtCoder Regular Contest 027 解説AtCoder Regular Contest 027 解説
AtCoder Regular Contest 027 解説
 
AtCoder Regular Contest 023 解説
AtCoder Regular Contest 023 解説AtCoder Regular Contest 023 解説
AtCoder Regular Contest 023 解説
 
AtCoder Regular Contest 036 解説
AtCoder Regular Contest 036 解説AtCoder Regular Contest 036 解説
AtCoder Regular Contest 036 解説
 
AtCoder Beginner Contest 026 解説
AtCoder Beginner Contest 026 解説AtCoder Beginner Contest 026 解説
AtCoder Beginner Contest 026 解説
 
AtCoder Beginner Contest 033 解説
AtCoder Beginner Contest 033 解説AtCoder Beginner Contest 033 解説
AtCoder Beginner Contest 033 解説
 
AtCoder Beginner Contest 014 解説
AtCoder Beginner Contest 014 解説AtCoder Beginner Contest 014 解説
AtCoder Beginner Contest 014 解説
 
AtCoder Beginner Contest 021 解説
AtCoder Beginner Contest 021 解説AtCoder Beginner Contest 021 解説
AtCoder Beginner Contest 021 解説
 
AtCoder Beginner Contest 017 解説
AtCoder Beginner Contest 017 解説AtCoder Beginner Contest 017 解説
AtCoder Beginner Contest 017 解説
 

Semelhante a AtCoder Regular Contest 032 解説

Indeedなう 予選A 解説
Indeedなう 予選A 解説Indeedなう 予選A 解説
Indeedなう 予選A 解説AtCoder Inc.
 
AtCoder Beginner Contest 019 解説
AtCoder Beginner Contest 019 解説AtCoder Beginner Contest 019 解説
AtCoder Beginner Contest 019 解説AtCoder Inc.
 
AtCoder Beginner Contest 010 解説
AtCoder Beginner Contest 010 解説AtCoder Beginner Contest 010 解説
AtCoder Beginner Contest 010 解説AtCoder Inc.
 
AtCoder Beginner Contest 030 解説
AtCoder Beginner Contest 030 解説AtCoder Beginner Contest 030 解説
AtCoder Beginner Contest 030 解説AtCoder Inc.
 
AtCoder Beginner Contest 012 解説
AtCoder Beginner Contest 012 解説AtCoder Beginner Contest 012 解説
AtCoder Beginner Contest 012 解説AtCoder Inc.
 
Indeedなう 予選B 解説
Indeedなう 予選B 解説Indeedなう 予選B 解説
Indeedなう 予選B 解説AtCoder Inc.
 
AtCoder Beginner Contest 005 解説
AtCoder Beginner Contest 005 解説AtCoder Beginner Contest 005 解説
AtCoder Beginner Contest 005 解説AtCoder Inc.
 
AtCoder Regular Contest 035 解説
AtCoder Regular Contest 035 解説AtCoder Regular Contest 035 解説
AtCoder Regular Contest 035 解説AtCoder Inc.
 
AtCoder Beginner Contest 003 解説
AtCoder Beginner Contest 003 解説AtCoder Beginner Contest 003 解説
AtCoder Beginner Contest 003 解説AtCoder Inc.
 
Code iq×japanr 公開用
Code iq×japanr 公開用Code iq×japanr 公開用
Code iq×japanr 公開用Nobuaki Oshiro
 
AtCoder Regular Contest 026 解説
AtCoder Regular Contest 026 解説AtCoder Regular Contest 026 解説
AtCoder Regular Contest 026 解説AtCoder Inc.
 
実践・最強最速のアルゴリズム勉強会 第一回 講義資料(ワークスアプリケーションズ & AtCoder)
実践・最強最速のアルゴリズム勉強会 第一回 講義資料(ワークスアプリケーションズ & AtCoder)実践・最強最速のアルゴリズム勉強会 第一回 講義資料(ワークスアプリケーションズ & AtCoder)
実践・最強最速のアルゴリズム勉強会 第一回 講義資料(ワークスアプリケーションズ & AtCoder)AtCoder Inc.
 
AtCoder Beginner Contest 007 解説
AtCoder Beginner Contest 007 解説AtCoder Beginner Contest 007 解説
AtCoder Beginner Contest 007 解説AtCoder Inc.
 
8_C言語入門 - 条件分岐について(if-else if-else)
8_C言語入門 - 条件分岐について(if-else if-else)8_C言語入門 - 条件分岐について(if-else if-else)
8_C言語入門 - 条件分岐について(if-else if-else)bc_rikko
 
Pythonではじめる競技プログラミング
Pythonではじめる競技プログラミングPythonではじめる競技プログラミング
Pythonではじめる競技プログラミングcocodrips
 
Rustで始める競技プログラミング
Rustで始める競技プログラミングRustで始める競技プログラミング
Rustで始める競技プログラミングNaoya Okanami
 
AtCoder Beginner Contest 028 解説
AtCoder Beginner Contest 028 解説AtCoder Beginner Contest 028 解説
AtCoder Beginner Contest 028 解説AtCoder Inc.
 
AtCoder Beginner Contest 008 解説
AtCoder Beginner Contest 008 解説AtCoder Beginner Contest 008 解説
AtCoder Beginner Contest 008 解説AtCoder Inc.
 
AtCoder Beginner Contest 034 解説
AtCoder Beginner Contest 034 解説AtCoder Beginner Contest 034 解説
AtCoder Beginner Contest 034 解説AtCoder Inc.
 

Semelhante a AtCoder Regular Contest 032 解説 (20)

Indeedなう 予選A 解説
Indeedなう 予選A 解説Indeedなう 予選A 解説
Indeedなう 予選A 解説
 
AtCoder Beginner Contest 019 解説
AtCoder Beginner Contest 019 解説AtCoder Beginner Contest 019 解説
AtCoder Beginner Contest 019 解説
 
AtCoder Beginner Contest 010 解説
AtCoder Beginner Contest 010 解説AtCoder Beginner Contest 010 解説
AtCoder Beginner Contest 010 解説
 
AtCoder Beginner Contest 030 解説
AtCoder Beginner Contest 030 解説AtCoder Beginner Contest 030 解説
AtCoder Beginner Contest 030 解説
 
AtCoder Beginner Contest 012 解説
AtCoder Beginner Contest 012 解説AtCoder Beginner Contest 012 解説
AtCoder Beginner Contest 012 解説
 
Indeedなう 予選B 解説
Indeedなう 予選B 解説Indeedなう 予選B 解説
Indeedなう 予選B 解説
 
AtCoder Beginner Contest 005 解説
AtCoder Beginner Contest 005 解説AtCoder Beginner Contest 005 解説
AtCoder Beginner Contest 005 解説
 
AtCoder Regular Contest 035 解説
AtCoder Regular Contest 035 解説AtCoder Regular Contest 035 解説
AtCoder Regular Contest 035 解説
 
AtCoder Beginner Contest 003 解説
AtCoder Beginner Contest 003 解説AtCoder Beginner Contest 003 解説
AtCoder Beginner Contest 003 解説
 
Code iq×japanr 公開用
Code iq×japanr 公開用Code iq×japanr 公開用
Code iq×japanr 公開用
 
Tokyo r27
Tokyo r27Tokyo r27
Tokyo r27
 
AtCoder Regular Contest 026 解説
AtCoder Regular Contest 026 解説AtCoder Regular Contest 026 解説
AtCoder Regular Contest 026 解説
 
実践・最強最速のアルゴリズム勉強会 第一回 講義資料(ワークスアプリケーションズ & AtCoder)
実践・最強最速のアルゴリズム勉強会 第一回 講義資料(ワークスアプリケーションズ & AtCoder)実践・最強最速のアルゴリズム勉強会 第一回 講義資料(ワークスアプリケーションズ & AtCoder)
実践・最強最速のアルゴリズム勉強会 第一回 講義資料(ワークスアプリケーションズ & AtCoder)
 
AtCoder Beginner Contest 007 解説
AtCoder Beginner Contest 007 解説AtCoder Beginner Contest 007 解説
AtCoder Beginner Contest 007 解説
 
8_C言語入門 - 条件分岐について(if-else if-else)
8_C言語入門 - 条件分岐について(if-else if-else)8_C言語入門 - 条件分岐について(if-else if-else)
8_C言語入門 - 条件分岐について(if-else if-else)
 
Pythonではじめる競技プログラミング
Pythonではじめる競技プログラミングPythonではじめる競技プログラミング
Pythonではじめる競技プログラミング
 
Rustで始める競技プログラミング
Rustで始める競技プログラミングRustで始める競技プログラミング
Rustで始める競技プログラミング
 
AtCoder Beginner Contest 028 解説
AtCoder Beginner Contest 028 解説AtCoder Beginner Contest 028 解説
AtCoder Beginner Contest 028 解説
 
AtCoder Beginner Contest 008 解説
AtCoder Beginner Contest 008 解説AtCoder Beginner Contest 008 解説
AtCoder Beginner Contest 008 解説
 
AtCoder Beginner Contest 034 解説
AtCoder Beginner Contest 034 解説AtCoder Beginner Contest 034 解説
AtCoder Beginner Contest 034 解説
 

Mais de AtCoder Inc.

AtCoderに毎回参加したくなる仕組み
AtCoderに毎回参加したくなる仕組みAtCoderに毎回参加したくなる仕組み
AtCoderに毎回参加したくなる仕組みAtCoder Inc.
 
Square869120 contest #2
Square869120 contest #2Square869120 contest #2
Square869120 contest #2AtCoder Inc.
 
AtCoder Beginner Contest 035 解説
AtCoder Beginner Contest 035 解説AtCoder Beginner Contest 035 解説
AtCoder Beginner Contest 035 解説AtCoder Inc.
 
Disco Presents ディスカバリーチャンネルプログラミングコンテスト2016 本選 解説
Disco Presents ディスカバリーチャンネルプログラミングコンテスト2016 本選 解説Disco Presents ディスカバリーチャンネルプログラミングコンテスト2016 本選 解説
Disco Presents ディスカバリーチャンネルプログラミングコンテスト2016 本選 解説AtCoder Inc.
 
Chokudai Contest 001
Chokudai Contest 001Chokudai Contest 001
Chokudai Contest 001AtCoder 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.
 
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 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 Regular Contest 044 解説
AtCoder Regular Contest 044 解説AtCoder Regular Contest 044 解説
AtCoder Regular Contest 044 解説AtCoder Inc.
 
天下一プログラマーコンテスト2015 予選B 解説
天下一プログラマーコンテスト2015 予選B 解説天下一プログラマーコンテスト2015 予選B 解説
天下一プログラマーコンテスト2015 予選B 解説AtCoder Inc.
 

Mais de AtCoder Inc. (20)

TCO2017R1
TCO2017R1TCO2017R1
TCO2017R1
 
AtCoderに毎回参加したくなる仕組み
AtCoderに毎回参加したくなる仕組みAtCoderに毎回参加したくなる仕組み
AtCoderに毎回参加したくなる仕組み
 
Square869120 contest #2
Square869120 contest #2Square869120 contest #2
Square869120 contest #2
 
AtCoder Beginner Contest 035 解説
AtCoder Beginner Contest 035 解説AtCoder Beginner Contest 035 解説
AtCoder Beginner Contest 035 解説
 
Disco Presents ディスカバリーチャンネルプログラミングコンテスト2016 本選 解説
Disco Presents ディスカバリーチャンネルプログラミングコンテスト2016 本選 解説Disco Presents ディスカバリーチャンネルプログラミングコンテスト2016 本選 解説
Disco Presents ディスカバリーチャンネルプログラミングコンテスト2016 本選 解説
 
Chokudai Contest 001
Chokudai Contest 001Chokudai Contest 001
Chokudai Contest 001
 
AtCoder Regular Contest 048
AtCoder Regular Contest 048AtCoder Regular Contest 048
AtCoder Regular Contest 048
 
MUJINプログラミングチャレンジ2016 解説
MUJINプログラミングチャレンジ2016 解説MUJINプログラミングチャレンジ2016 解説
MUJINプログラミングチャレンジ2016 解説
 
arc047
arc047arc047
arc047
 
abc032
abc032abc032
abc032
 
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 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 Regular Contest 044 解説
AtCoder Regular Contest 044 解説AtCoder Regular Contest 044 解説
AtCoder Regular Contest 044 解説
 
天下一プログラマーコンテスト2015 予選B 解説
天下一プログラマーコンテスト2015 予選B 解説天下一プログラマーコンテスト2015 予選B 解説
天下一プログラマーコンテスト2015 予選B 解説
 

Último

東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2
東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2
東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2Tokyo Institute of Technology
 
The_Five_Books_Overview_Presentation_2024
The_Five_Books_Overview_Presentation_2024The_Five_Books_Overview_Presentation_2024
The_Five_Books_Overview_Presentation_2024koheioishi1
 
UniProject Workshop Make a Discord Bot with JavaScript
UniProject Workshop Make a Discord Bot with JavaScriptUniProject Workshop Make a Discord Bot with JavaScript
UniProject Workshop Make a Discord Bot with JavaScriptyuitoakatsukijp
 
ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学ssusere0a682
 
TokyoTechGraduateExaminationPresentation
TokyoTechGraduateExaminationPresentationTokyoTechGraduateExaminationPresentation
TokyoTechGraduateExaminationPresentationYukiTerazawa
 
生成AIの回答内容の修正を課題としたレポートについて:お茶の水女子大学「授業・研究における生成系AIの活用事例」での講演資料
生成AIの回答内容の修正を課題としたレポートについて:お茶の水女子大学「授業・研究における生成系AIの活用事例」での講演資料生成AIの回答内容の修正を課題としたレポートについて:お茶の水女子大学「授業・研究における生成系AIの活用事例」での講演資料
生成AIの回答内容の修正を課題としたレポートについて:お茶の水女子大学「授業・研究における生成系AIの活用事例」での講演資料Takayuki Itoh
 
ゲーム理論 BASIC 演習106 -価格の交渉ゲーム-#ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習106 -価格の交渉ゲーム-#ゲーム理論 #gametheory #数学ゲーム理論 BASIC 演習106 -価格の交渉ゲーム-#ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習106 -価格の交渉ゲーム-#ゲーム理論 #gametheory #数学ssusere0a682
 

Último (7)

東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2
東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2
東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2
 
The_Five_Books_Overview_Presentation_2024
The_Five_Books_Overview_Presentation_2024The_Five_Books_Overview_Presentation_2024
The_Five_Books_Overview_Presentation_2024
 
UniProject Workshop Make a Discord Bot with JavaScript
UniProject Workshop Make a Discord Bot with JavaScriptUniProject Workshop Make a Discord Bot with JavaScript
UniProject Workshop Make a Discord Bot with JavaScript
 
ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学
 
TokyoTechGraduateExaminationPresentation
TokyoTechGraduateExaminationPresentationTokyoTechGraduateExaminationPresentation
TokyoTechGraduateExaminationPresentation
 
生成AIの回答内容の修正を課題としたレポートについて:お茶の水女子大学「授業・研究における生成系AIの活用事例」での講演資料
生成AIの回答内容の修正を課題としたレポートについて:お茶の水女子大学「授業・研究における生成系AIの活用事例」での講演資料生成AIの回答内容の修正を課題としたレポートについて:お茶の水女子大学「授業・研究における生成系AIの活用事例」での講演資料
生成AIの回答内容の修正を課題としたレポートについて:お茶の水女子大学「授業・研究における生成系AIの活用事例」での講演資料
 
ゲーム理論 BASIC 演習106 -価格の交渉ゲーム-#ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習106 -価格の交渉ゲーム-#ゲーム理論 #gametheory #数学ゲーム理論 BASIC 演習106 -価格の交渉ゲーム-#ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習106 -価格の交渉ゲーム-#ゲーム理論 #gametheory #数学
 

AtCoder Regular Contest 032 解説

  • 1. AtCoder Regular Contest 032 解説 AtCoder株式会社 代表取締役 高橋 直大 2015/1/3 1
  • 3. ©AtCoder Inc. All rights reserved. 3 A問題 ホリドッグ 1. 問題概要 2. アルゴリズム 2015/1/3 3
  • 4. A問題 問題概要 • Nが与えられる • 1+2+…+Nの素数判定せよ • 制約 – 1 ≦ N ≦ 999 2015/1/3 4
  • 5. A問題 アルゴリズム • 解法1 – S=1+2+…+Nをforループで計算する • N=1000のとき最大でS=1+2+…+1000 = 500500 – それに対して素数判定をforループで行う • 2~S-1の範囲でSを割り切る数がないか確かめる • 解法2 – S=1+2+…+N= 𝑁 𝑁+1 2 (総和の公式) • 式から明らかにNが小さいとき以外は素数にならなさそう – N=1のときは1なので素数ではない – N=2のときは素数 – N>2のとき常に合成数 • N=2のときだけ素数,それ以外のとき非素数なので, その事実にしたがって出力すればよい 2015/1/3 5
  • 6. ©AtCoder Inc. All rights reserved. 6 B問題 道路工事 1. 問題概要 2. アルゴリズム 2015/1/3 6
  • 7. B問題 問題概要 • N 頂点 M 辺の無向グラフが与えられる • グラフに最小でいくつ辺を追加すれば、全体がつな がるか調べる • 制約 – 0 ≦ N,M ≦ 100000 2015/1/3 7
  • 8. B問題 アルゴリズム • 考察 – グラフのつながっている部分がK個あるとき、最小でK-1本 の辺があれば全体をつなげられる。 – 1本つながっていない部分の間に辺を追加すると、Kは1減 るから。 2015/1/3 8 黒がもともとある道路 このとき、K=3 2本の赤の辺を追加すれば全 体がつながる
  • 9. B問題 アルゴリズム • なので、グラフのつながっている部分(連結成分と呼 ばれる)の数を数えればよい。 • 解法1 – Union-Findですべての辺をつないだ後、Union-Find木での root の数を数える(具体的には、頂点 v のrootが v のもの を数えると楽。連結成分ごとに root は共通で、自身が root となるものがちょうど 1 つあるから) • 解法2 – 今まででまだ訪れていない頂点を見つけたら、 DFSを使い そこから行ける頂点をすべて訪れて、連結成分の数を1つ 加える etc… • どちらも(ほぼ)線形時間 2015/1/3 9
  • 10. ©AtCoder Inc. All rights reserved. 10 C問題 仕事計画 1. 問題概要 2. アルゴリズム 2015/1/3 10
  • 11. C問題 問題概要 • 時刻の区間がN個与えられます。区間は順に1から Nまで番号付けられています。 • i 番目の区間は a_i から b_i まで。 • 互いに被らない条件の下で、なるべく多くの区間を 選びたい(端点は被ってもOK) • 複数あるときは、区間の早い順に並べた時の辞書 順最小となるものを1つ出力。 • 制約 – 0 ≦ a_i, b_i ≦ 1000000 – 1 ≦ N ≦ 100000 2015/1/3 11
  • 12. C問題 アルゴリズム • これ蟻本でやったやつだ!(区間スケジューリング問 題, p43) – 蟻本を読もう! – 具体的には、終了時間が早い順にソートし、貪欲に区間 を選んで行けば、区間数最大の解が1つ得られる • しかし、辞書順最小での構成を1つ出力しなければ ならない • なるべく多く取れる取り方のうち、辞書順最小のもの を求めるときは、最初に取れるものを最小化し続け る必要がある 2015/1/3 12
  • 13. C問題 アルゴリズム • 時刻 i それぞれに対し、(i 以降で最大でいくつ取れ るか?,最大の取り方のうち、次に取れる最小の仕事 の番号はいくつか?) のペアが更新すればできそう – i から始めるとき、次に取る区間は辞書順最小の条件か ら、(最大の取り方のうち、次に取れる最小の仕事の番号) となるから • このペアを dp[i] とおく 2015/1/3 13
  • 14. C問題 アルゴリズム • dp[i] を求めるとき、 – 時刻 i から始まる区間を使うとき、時刻 i から始まり、b で終わ る番号idの区間を使う場合、 (b以降で取れる区間の最大数 +1,id) が候補 – 時刻 i から始まる区間を使わないとき、(時刻 i+1 以降で取れる 区間の最大数, そのうちの最小の仕事の番号) が候補 – 以上のペアから、取れる区間の最大数で比較し、多いものを選 ぶ。それが同じなら、次に取る仕事の番号が小さいものを選ぶ。 • 番号が同じ区間はないので、このペアが同じになることは無い • 以上のことから、dp[i] の更新に必要なのは i+1 以降の dpの情報 • よって、dp[i] を後ろから更新していけばよい 2015/1/3 14
  • 15. C問題 アルゴリズム • dp[0] が求まったら、0 以降で取れる区間の最大数 が1つ目の答え。 • 復元するときは、今の時刻以降で最大の取り方のう ち最小の番号の区間をとり続けていく – dp のペアの2番目の情報にこれがそのまま入っている – 最初に “今の時刻”=0 とし、次に取る区間を答えに追加 し、”今の時刻”を最後に取った区間の終端に更新 – これを、取れる区間が無くなるまで繰り返す • 合計でもO(N)! 2015/1/3 15
  • 16. ©AtCoder Inc. All rights reserved. 16 D問題 アットコーダーモンスターズ 1. 問題概要 2. 考察 3. アルゴリズム 2015/1/3 16
  • 17. D問題 問題概要 • N匹のモンスターがいる • 各モンスターには攻撃力と防御力というパラメータがある • ちょうどK匹のモンスターを買いたい • あるモンスターの対について,攻撃力の差と防御力の差の 最大値を不安定度と定義 • K匹からなるチームに含まれるペアの不安定度の最大値 (=チームの不安定度)を最小化し,それを達成する組み合わ せ数 mod 100000007 を出力しろ. • 制約 – 1 ≦ K ≦ N ≦ 100,000 – 0 ≦ 各モンスターの防御力,攻撃力 ≦ 3000 2015/1/3 17
  • 18. D問題 考察 • まず,チームの不安定度の最小値を求めたい. • モンスターの(攻撃力,防御力)を二次元平面に点とし てプロットしてみる • あるチームの不安定度をxと決めたとき, – 一辺xの正方形領域に含まれる点の数がK以上であるようなところ が存在すれば,不安定度x以下にできることが分かる. • これで二分探索したらよさそう. • 任意の正方形領域に含まれる点の数を高速に計算 するため,予め二次元累積和を計算しておく.
  • 19. D問題 考察 • 次にチームの不安定度の最小値mを達成する組み 合わせ数を求めたい. • 単純に全ての領域に対してKコを選ぶ組み合わせの 数を計算するのは,重複が発生しダメ. • ある点を角(x,y)と決めたときに,その点を角にした 正方形(左上(x,y)右下(x+m,y+m))のときにしか達成 できないような選び方を計算することで重複なく数え られる • そのような選び方は2パターンある(次スライド)
  • 20. D問題 考察 • パターン1 : 選んだ角(x,y)に1つ以上の点がある • パターン2 : 選んだ角(x,y)に点は無いが,(x,?)と(?,y) に1つ以上ずつ点がある. ケース1(3通り) ケース2(1通り) ↑4つの点がある適当な例(K=3とする)
  • 21. D問題 考察 • 説明のために – 正方形領域の全ての点の数をall – 角(x,y)の点をcorner – 左端領域の点と上端領域の点の数をleft,top と表す [パターン1の個数] – nCr(all,K) - nCr(all-corner,K) [パターン2の個数] – nCr(number-corner,K) - nCr(number-corner-top,K) - ncr(number-corner-left,K) + nCr(number-corner-(top+left),K) corner以外でKコ cornerとtop以外でKコ cornerとleft以外でKコ cornerとleftとtop以外でKコ (引きすぎた分を足す,包除原理)
  • 22. D問題 アルゴリズム • モンスターのパラメータの最大値をM(<=3000)とする • Nコの点をプロットする → O(N) • 二次元累積和を計算しておく → O(M^2) • チームの不安定度の最小値mを二分探索で求める → 累積和を用いて O(M^2 log M) • 組み合わせ数を求める → O(M^2) nCrの計算は予め0≦k≦Nについてk!と(k!の逆元)をmod 10^9+7で計算しておく ことでO(1) • 全体として O(M^2 log M)