Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
2
A: Table Tennis
writer: kawatea
tester: taka_key
! 問題概要
3
1 65432
• n人の人を2人ずつのペアにする
• ペアの強さ := 2人の強さの和
• 一番強いペアと一番弱いペアの強さの差の最小は?
! 直感的な考察
4
1 65432
• 強い人は弱い人と組んだ方が良さそう
• 強いほうと弱いほうから一人ずつ順番にペアにしてはどうか

→ 正しい
! 証明
5
1
 
 
   
2
 
 … …
……
強い 弱い
弱い 強い
• 強い順に 1,2,…,n とし

一番強いペアを i と n - i のペアとする
! 証明
6
1
 
 
   
2
 
 … …
……
強い 弱い
弱い 強い
• 一番強いペアの強さを小さくするためには、

i までの人はn - i以降の人とペアになる必要がある
! 証明
7
1
 
 
   
2
 
 … …
……
強い 弱い
弱い 強い
• i までの人の誰かはn - i の人とペアになるため

一番強いペアの強さを小さくすることはできない
! 証明
8
1
 
 
   
2
 
 … …
……
強い 弱い
弱い 強い
• 一番弱いペアについても、同様にして

強さを大きくすることはできない
! 想定解法
9
1. n人の人を強さでソート - O(n logn)
2. 強い方と弱い方から1人ずつ順番にペアにする - O(n)
3. 各ペアの強さを調べる - O(n)
10
writer: numa
tester: taka_key
B: Office Ninja
! 問題概要
11
• 辺を越えてのみ移動できる
• マスへ入ったときに、そこにある数の分だけコストがかかる
• StartからGoalへの最小コストは?
• マスの数は最大で 100 100
! 想定解法
12
ダイクストラ!
! 想定解法
13
• 正方形のマスを移動する場合と同じように考える

典型的な方法
int dx[4] = { 1, 0,-1, 0};
int dy[4] = { 0,-1, 0, 1};
for(int i = 0; i < 4; ++i...
! 想定解法
14
1. 上手い具合に移動に使う配列を設定する

行の座標が偶数の場合と奇数の場合に分ける
• 次のことに気をつける
• indexが0-basedかどうか
• 行と列、どちらで場合を分けるか
! 想定解法
15
2. 頑張るとこんな感じにできる
int dx[2][6] = {{-1, 0, 1, 1, 0,-1},
{-1, 0, 1, 1, 0,-1}};
int dy[2][6] = {{ 0, 1, 0,-1,-1,-1},...
16
writer: Keith
tester: numa
B: Optimal Recommendations
! 問題概要
17
• 求職者の技術力、語学力、コミュ力が与えられる
• 会社が採用にあたって最低限必要としている技術力、語学力、
コミュ力、その会社での年収が与えられる
• 求職者毎に応募可能な会社の中で一番高い年収を示しなさい
! 問題概要
18
• 求職者の技術力、語学力、コミュ力が与えられる
• 会社が採用にあたって最低限必要としている技術力、語学力、
コミュ力、その会社での年収が与えられる
• 求職者毎に応募可能な会社の中で一番高い年収を示しなさい
! 制約
•...
! サンプル
19
! サンプル
20
! 解法
21
• 線形探索した場合、の計算量は

O(求職者数 会社数) なので、50,0002で間に合わない

• 前計算して求職者のクエリをO(1)かO(logn)で処理したい
• 技術力 語学力 コミュ力 = 1013

→メモリに収ま...
! 解法
22
• dp[a][b][c]を、技術力a、語学力b、コミュ力cの求職者が得
られる最大の年収だとすると、次が成立する。
• dp[a][b][c] ≧ max(dp[a - 1][b][c], dp[a][b - 1][c], d...
! 解法
23
• dp[i][j][k] = max(dp[i][j][k], dp[i- 1][j][k], dp[i][j- 1][k],

dp[i][j][k- 1])
• 会社が希望する能力をa, b, c, 年収をwとしたとき、
...
! 別解
24
• 求人会社を年収の大きい順でソート
• dpの配列は0で初期化しておく
• 年収の大きい会社から順に見ていき、次の操作を行う
• a i, b j, c kをみたすような範囲の

dp[i][j][k] を見て、0でないならw...
! 別解イメージ(二次元版)
25
! 別解イメージ(二次元版)
26
! 別解イメージ(二次元版)
27
! 別解イメージ(二次元版)
28
29
writer: kawatea
tester: amylase
D: Longest Path
! 問題概要
30
1 4
3
2
5
• n頂点の有向な木が与えられる
• いくつかの辺は好きな向きを選べる
• うまく向きを選んだときの最長のパスの長さは?
! 考察
31
1
4
32
5
• 適当な根付き木にしてみる
• 各パスはある頂点から上向きに進んで

下向きに進む
! 考察
32
1
4
32
5
• 各頂点に対して上向きと下向きの最長のパスがわかると

その頂点を中心とする最長のパスが

求まる
! 考察
33
• ただし上向きと下向きのパスが同じ頂点を通らないように

二番目に長いパスも必要
1
4
32
5
! 想定解法
34
• 木を適当な根付き木にする
• 再帰的に頂点を探索して、各頂点以下の上向きと下向きの

1 or 2番目に長いパスの長さを求める
• 各頂点を中心とするパスが今まで見つけたものより長いなら
答えを更新する
• 各頂点は再帰...
35
writer: Komaki
tester: amylase
E: Page Rank
! 問題概要
36
• 従業員を頂点とする有向グラフがある

­ 辺が優秀と思っている関係を示す

­ 従業員番号の差が10以上だと辺は存在しない

• このグラフ上でPage Rankを求めてください

­ 定義は問題文に示してあります
! 要するに
37
• 連立一次方程式を解いてください
• 帯行列

­ 非ゼロ成分の場所が対角に近いところにしかない
• 正則

­ 転地が対角優位行列

 ・各行の対角成分の絶対値が、それ以外の成分の絶対値の

  和よりも大きい

 ・対...
! 解法1: 帯行列でのガウスの消去法
38
• ガウスの消去法の操作をだいぶサボれる

­ ゼロとわかっている要素は消しにいく必要がない

­ 行の好感が必要かもしれないが、

 行列の値は帯の幅の2倍分覚えておけば十分

• 行列の次数をn...
! 解法2: 収束するまで回す
39
• 初期のPage Rankを1として、

Page Rankの定義式を更新式と見なして、

収束するまで更新を続ける

• 疎行列なので、1回の更新が十分に速い - O(m + n)
• 大体1,000回...
40
writer: rng_58
tester: kawatea
F: 就職活動
! 問題概要
41
• N 人の人がいて、それぞれの人は {す社、ぬ社、け社}

の部分集合への就職を希望する
• す社、ぬ社、け社へはそれぞれ高々X, Y, Z 人が就職できる
• 全ての人が就職できるような組み合わせは何通りあるか

• (...
! 部分点 (1)
42
• 人を7種類に分類する
• す社のみを希望する人:nx 人
• ぬ社のみを希望する人:ny 人
• け社のみを希望する人:nz 人
• す、ぬを希望する人:nx,y 人
• ぬ、けを希望する人:ny,z 人
• け、...
! 部分点 (2)
43
• このとき、全ての人
が就職できるかどう
かは

右のグラフでフロー
をN流せるかどうかに
よって判定できる
! 部分点 (3)
44
• 条件をみたすすべての
• (nx, ny, nz, nx,y, ny,z, nz,x, nx,y,z)の組を考え、
•             の和を求めれば良い

• O(N6)
N!
nx! ny! nz! n...
! 満点 (1)
45
• グラフのmincutを考えると (Hall s Theoremともいわれて
います)
• フローをN流せる条件は
! 満点 (2)
46
• nx, ny, nz, nx,y を定数とみると、

これはある定数 c1, c2, c3, を用いて次のように書ける
! 満点 (3)
47
Indeedなう A日程 解説
You’ve finished this document.
Download and read it offline.
Upcoming SlideShare
競技プログラミングでの線型方程式系
Next
Upcoming SlideShare
競技プログラミングでの線型方程式系
Next
Download to read offline and view in fullscreen.

Share

Indeedなう A日程 解説

Download to read offline

Indeedなう A日程 解説

Related Audiobooks

Free with a 30 day trial from Scribd

See all

Indeedなう A日程 解説

  1. 1. 2 A: Table Tennis writer: kawatea tester: taka_key
  2. 2. ! 問題概要 3 1 65432 • n人の人を2人ずつのペアにする • ペアの強さ := 2人の強さの和 • 一番強いペアと一番弱いペアの強さの差の最小は?
  3. 3. ! 直感的な考察 4 1 65432 • 強い人は弱い人と組んだ方が良さそう • 強いほうと弱いほうから一人ずつ順番にペアにしてはどうか
 → 正しい
  4. 4. ! 証明 5 1         2    … … …… 強い 弱い 弱い 強い • 強い順に 1,2,…,n とし
 一番強いペアを i と n - i のペアとする
  5. 5. ! 証明 6 1         2    … … …… 強い 弱い 弱い 強い • 一番強いペアの強さを小さくするためには、
 i までの人はn - i以降の人とペアになる必要がある
  6. 6. ! 証明 7 1         2    … … …… 強い 弱い 弱い 強い • i までの人の誰かはn - i の人とペアになるため
 一番強いペアの強さを小さくすることはできない
  7. 7. ! 証明 8 1         2    … … …… 強い 弱い 弱い 強い • 一番弱いペアについても、同様にして
 強さを大きくすることはできない
  8. 8. ! 想定解法 9 1. n人の人を強さでソート - O(n logn) 2. 強い方と弱い方から1人ずつ順番にペアにする - O(n) 3. 各ペアの強さを調べる - O(n)
  9. 9. 10 writer: numa tester: taka_key B: Office Ninja
  10. 10. ! 問題概要 11 • 辺を越えてのみ移動できる • マスへ入ったときに、そこにある数の分だけコストがかかる • StartからGoalへの最小コストは? • マスの数は最大で 100 100
  11. 11. ! 想定解法 12 ダイクストラ!
  12. 12. ! 想定解法 13 • 正方形のマスを移動する場合と同じように考える
 典型的な方法 int dx[4] = { 1, 0,-1, 0}; int dy[4] = { 0,-1, 0, 1}; for(int i = 0; i < 4; ++i){ int nx = x + dx[i]; int ny = y + dy[i]; ……… } • 六角座標ではどうなる?
  13. 13. ! 想定解法 14 1. 上手い具合に移動に使う配列を設定する
 行の座標が偶数の場合と奇数の場合に分ける • 次のことに気をつける • indexが0-basedかどうか • 行と列、どちらで場合を分けるか
  14. 14. ! 想定解法 15 2. 頑張るとこんな感じにできる int dx[2][6] = {{-1, 0, 1, 1, 0,-1}, {-1, 0, 1, 1, 0,-1}}; int dy[2][6] = {{ 0, 1, 0,-1,-1,-1}, { 1, 1, 1 0,-1, 0}}; for(int i = 0; i < 6; ++i){ int nx = x + dx[x&1][i]; int ny = y + dy[x&1][i]; ……… } 3. 他は正方形の座標の場合と全く同じ
  15. 15. 16 writer: Keith tester: numa B: Optimal Recommendations
  16. 16. ! 問題概要 17 • 求職者の技術力、語学力、コミュ力が与えられる • 会社が採用にあたって最低限必要としている技術力、語学力、 コミュ力、その会社での年収が与えられる • 求職者毎に応募可能な会社の中で一番高い年収を示しなさい
  17. 17. ! 問題概要 18 • 求職者の技術力、語学力、コミュ力が与えられる • 会社が採用にあたって最低限必要としている技術力、語学力、 コミュ力、その会社での年収が与えられる • 求職者毎に応募可能な会社の中で一番高い年収を示しなさい ! 制約 • 求職者数、会社数 50,000 • 技術力、語学力、コミュ力 100 • 年収 1,000,000,000
  18. 18. ! サンプル 19
  19. 19. ! サンプル 20
  20. 20. ! 解法 21 • 線形探索した場合、の計算量は
 O(求職者数 会社数) なので、50,0002で間に合わない
 • 前計算して求職者のクエリをO(1)かO(logn)で処理したい • 技術力 語学力 コミュ力 = 1013
 →メモリに収まる!
  全てのクエリに対して前計算をする。
  21. 21. ! 解法 22 • dp[a][b][c]を、技術力a、語学力b、コミュ力cの求職者が得 られる最大の年収だとすると、次が成立する。 • dp[a][b][c] ≧ max(dp[a - 1][b][c], dp[a][b - 1][c], dp[a][b][c - 1]) • つまり、自分よりも能力が劣っている求職者と同じかそれよ りも大きい年収が得られる • 会社が希望する能力をa, b, c, 年収をwとしたとき、
 dp[a][b][c] := w
 と初期化しておけば、
  22. 22. ! 解法 23 • dp[i][j][k] = max(dp[i][j][k], dp[i- 1][j][k], dp[i][j- 1][k],
 dp[i][j][k- 1]) • 会社が希望する能力をa, b, c, 年収をwとしたとき、
 dp[a][b][c] := w
 と初期化しておけば、 • と、i, j, kの小さいものから順にテーブルを更新することで
 求職者のクエリにO(1)で答えることが可能になる。
  23. 23. ! 別解 24 • 求人会社を年収の大きい順でソート • dpの配列は0で初期化しておく • 年収の大きい会社から順に見ていき、次の操作を行う • a i, b j, c kをみたすような範囲の
 dp[i][j][k] を見て、0でないならwを代入
 0なら終了する • どのdp[a][b][c]についても、値の代入は高々1回しか起こら ないため、この操作は1013回程度で終了する。
  24. 24. ! 別解イメージ(二次元版) 25
  25. 25. ! 別解イメージ(二次元版) 26
  26. 26. ! 別解イメージ(二次元版) 27
  27. 27. ! 別解イメージ(二次元版) 28
  28. 28. 29 writer: kawatea tester: amylase D: Longest Path
  29. 29. ! 問題概要 30 1 4 3 2 5 • n頂点の有向な木が与えられる • いくつかの辺は好きな向きを選べる • うまく向きを選んだときの最長のパスの長さは?
  30. 30. ! 考察 31 1 4 32 5 • 適当な根付き木にしてみる • 各パスはある頂点から上向きに進んで
 下向きに進む
  31. 31. ! 考察 32 1 4 32 5 • 各頂点に対して上向きと下向きの最長のパスがわかると
 その頂点を中心とする最長のパスが
 求まる
  32. 32. ! 考察 33 • ただし上向きと下向きのパスが同じ頂点を通らないように
 二番目に長いパスも必要 1 4 32 5
  33. 33. ! 想定解法 34 • 木を適当な根付き木にする • 再帰的に頂点を探索して、各頂点以下の上向きと下向きの
 1 or 2番目に長いパスの長さを求める • 各頂点を中心とするパスが今まで見つけたものより長いなら 答えを更新する • 各頂点は再帰で一度訪れるだけなので、
 全体の計算量は O(n + m)となる
  34. 34. 35 writer: Komaki tester: amylase E: Page Rank
  35. 35. ! 問題概要 36 • 従業員を頂点とする有向グラフがある
 ­ 辺が優秀と思っている関係を示す
 ­ 従業員番号の差が10以上だと辺は存在しない
 • このグラフ上でPage Rankを求めてください
 ­ 定義は問題文に示してあります
  36. 36. ! 要するに 37 • 連立一次方程式を解いてください • 帯行列
 ­ 非ゼロ成分の場所が対角に近いところにしかない • 正則
 ­ 転地が対角優位行列
  ・各行の対角成分の絶対値が、それ以外の成分の絶対値の
   和よりも大きい
  ・対角優位行列は正則であることが知られている
 ­ 求めるPage Rankは一意に定まる
  37. 37. ! 解法1: 帯行列でのガウスの消去法 38 • ガウスの消去法の操作をだいぶサボれる
 ­ ゼロとわかっている要素は消しにいく必要がない
 ­ 行の好感が必要かもしれないが、
  行列の値は帯の幅の2倍分覚えておけば十分
 • 行列の次数をn、帯の幅をkとして、O(nk2)
 ­ n = 104
 ­ k = 10
  38. 38. ! 解法2: 収束するまで回す 39 • 初期のPage Rankを1として、
 Page Rankの定義式を更新式と見なして、
 収束するまで更新を続ける
 • 疎行列なので、1回の更新が十分に速い - O(m + n) • 大体1,000回程度回せば通る
  39. 39. 40 writer: rng_58 tester: kawatea F: 就職活動
  40. 40. ! 問題概要 41 • N 人の人がいて、それぞれの人は {す社、ぬ社、け社}
 の部分集合への就職を希望する • す社、ぬ社、け社へはそれぞれ高々X, Y, Z 人が就職できる • 全ての人が就職できるような組み合わせは何通りあるか
 • (文字の使い方は元の問題と変えてあります)
  41. 41. ! 部分点 (1) 42 • 人を7種類に分類する • す社のみを希望する人:nx 人 • ぬ社のみを希望する人:ny 人 • け社のみを希望する人:nz 人 • す、ぬを希望する人:nx,y 人 • ぬ、けを希望する人:ny,z 人 • け、すを希望する人:nz,x 人 • 全て希望する人:nx,y,z 人 とする • nx +ny +nz + nx,y +ny,z + nz,x + nx,y,z = N
  42. 42. ! 部分点 (2) 43 • このとき、全ての人 が就職できるかどう かは
 右のグラフでフロー をN流せるかどうかに よって判定できる
  43. 43. ! 部分点 (3) 44 • 条件をみたすすべての • (nx, ny, nz, nx,y, ny,z, nz,x, nx,y,z)の組を考え、 •             の和を求めれば良い
 • O(N6) N! nx! ny! nz! nx,y! ny,z! nz,x! nx,y,z!
  44. 44. ! 満点 (1) 45 • グラフのmincutを考えると (Hall s Theoremともいわれて います) • フローをN流せる条件は
  45. 45. ! 満点 (2) 46 • nx, ny, nz, nx,y を定数とみると、
 これはある定数 c1, c2, c3, を用いて次のように書ける
  46. 46. ! 満点 (3) 47
  • ssuser9e1e6b

    Mar. 26, 2015

Indeedなう A日程 解説

Views

Total views

3,749

On Slideshare

0

From embeds

0

Number of embeds

157

Actions

Downloads

71

Shares

0

Comments

0

Likes

1

×