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.

arc047

2,758 views

Published on

AtCoder Regular Contest 047 解説

Published in: Education
  • Be the first to comment

  • Be the first to like this

arc047

  1. 1. ARC047解説 A:タブの開きすぎ
  2. 2. A-問題概要 ● L個以上タブを開くとクラッシュして、タブが1 個に減ってしまうブラウザがある ● 初めタブは1個だとして、そのあとの「タブを 開く」「タブを閉じる」の履歴が与えられるの で、クラッシュの回数をもとめよ。
  3. 3. A-考察 ● タブの個数以外気にしなくて良い。
  4. 4. A-解法 ● タブの個数を変数で管理しておく。
  5. 5. A-解法 ● タブの個数を変数で管理しておく。 ● タブを閉じるとき – 変数の値を1減らす
  6. 6. A-解法 ● タブの個数を変数で管理しておく。 ● タブを閉じるとき – 変数の値を1減らす ● タブを開くとき – タブの個数がL個未満ならば、変数の値を1増やす
  7. 7. A-解法 ● タブの個数を変数で管理しておく。 ● タブを閉じるとき – 変数の値を1減らす ● タブを開くとき – タブの個数がL個未満ならば、変数の値を1増やす – タブの個数がL個ならば変数の値を1にして、ク ラッシュの回数を1増やす
  8. 8. ARC047解説 B:同一円周上
  9. 9. B-問題概要 ● 格子点上の点が N 個与えられる。 ● 全ての点からのマンハッタン距離が等しい格子 点上の点Pを1つもとめよ ● N ≦ 10^5 ● -10^9 ≦ 座標の値 ≦ 10^9
  10. 10. B-考察 ● ある点からマンハッタン距離が等しい点の集合 はどのようなものか?
  11. 11. B-考察 ● ある点からマンハッタン距離が等しい点の集合 はどのようなものか? 点P
  12. 12. B-考察 ● ある点からマンハッタン距離が等しい点の集合 はどのようなものか? 点Pからマンハッタン距離3の点
  13. 13. B-考察 ● ある点からマンハッタン距離が等しい点の集合 はどのようなものか? →45度傾いた正方形の外周になる
  14. 14. B-考察 ● ある点からマンハッタン距離が等しい点の集合 はどのようなものか? →45度傾いた正方形の外周になる ● この正方形の大きさがわかれば、点Pのおおよ その見当がつく。
  15. 15. B-45度傾ける ● 45度傾いた状態で扱うのはわかりづらいの で、もとに戻すために、X,YではなくX+Y,X-Y で各点を表してみる。 ● すると軸に平行な正方形がでてくる。 →
  16. 16. B-考察 ● (回転後の)X座標の最大値と最小値の差、と (回転後の)Y座標の最大値と最小値の差のう ち大きい方が、正方形の1辺の長さと一致す る。
  17. 17. B-確認 ● 4辺の内全ての辺から1つ以上残っている場合 – Xの最大値と最小値の差も、Yの最大値と最小値の 差も一辺の長さと一致する。
  18. 18. B-確認 ● 4辺の内3つの辺から1つ以上残っている場合 – Xの最大値と最小値の差か、Yの最大値と最小値の 差の大きい方が一辺の長さと一致する。
  19. 19. B-確認 ● 4辺のうち向かい合う2辺について1つ以上残っ ている場合 – Xの最大値と最小値の差か、Yの最大値と最小値の 差の大きい方が一辺の長さと一致する。
  20. 20. B-確認 ● 4辺のうちとなりあう2辺について1つ以上残っ ている場合 – Xの最大値と最小値の差か、Yの最大値と最小値の 差の大きい方が一辺の長さと一致しない???
  21. 21. B-確認 ● 4辺のうちとなりあう2辺について1つ以上残っ ている場合 – Xの最大値と最小値の差か、Yの最大値と最小値の 差の大きい方が一辺の長さと一致する点Pがある。
  22. 22. B-考察 ● 1辺の長さについては、X座標の最大値と最小 値の差とY座標の最大値と最小値の差をみて、 大きい方をとればよい。 ● 1辺の長さをDとする。与えられたX座標、最 大最小をXmax,Xminで表し、点PのX座標、Y座 標をPx,Pyとすると Xmax-Px, Px -XminのいずれかがD/2と一致す る。 – Y座標も同様 ● よってDの値と全体のX座標、Y座標の最大最小 から点Pの候補が有限個に決まる
  23. 23. B-考察 ● さきほどの考察は45度回転した後の世界での 計算である。 ● 回転後のXやYの値は、回転前のX+YやX-Yの値 と対応するので、実装するときはその値でプロ グラムを組まなければならない。
  24. 24. B-解法 ● 与えられた点について(X+Y)の最大値と最小値 の差、(X-Y)座標の最大値と最小値の差を求 め、大きい方をDとする ● 先ほどの考察を使ってPx,Pyの値を有限個にし ぼりこむ ● そのうちすべての点とのマンハッタン距離が等 しい点を挙げれば良い
  25. 25. ARC047解説 C:N!÷K番目の単語
  26. 26. C-問題概要 ● [1,2,..,N]を並び替えたものを「単語」という ● 単語のうち辞書順で小さい方から N! / K番目 (1-index)のものを求めよ ● K ≦ N ≦ 10^5
  27. 27. C-考察1 ● 単語の中で辞書順X番目(0-index)のものを求め るにはどうすればいいか?
  28. 28. C-考察1 ● 単語の中で辞書順X番目(0-index)のものを求め るにはどうすればいいか? → 1文字目から順番に決めていけば良い
  29. 29. C-X番目の求め方 ● 1文字目が1であるような単語はいくつある か? – 2文字目以降の並びを考えると(N-1)!通り ● 1文字目が2であるような単語はいくつある か? – 同様に(N-1)!通り ● X番目の単語の1文字目は何か? – 上の考察より、[X / (N-1)!] + 1 – []はガウス記号
  30. 30. C-X番目の求め方 ● 1文字目が求まった!→Aとする ● つぎにもとめるべきものは? [1,2,..., A-1, A+1,...N]を並び替えたものの中で X % (N-1)!番目の物 ● さきほどと同様の計算で求めることが出来る。 ● 順番に繰り返せばすべての桁の値が決まる。 ● 以降は[X / (N-1)!] + 1ではなくて[X / (N-1)!] + 1番目に小さい値であることに注意
  31. 31. C-部分点 ● いまのような計算方法でN!/K番目の値をもとめ る。 ● N ≦ 20なのでN!/Kは64bit整数に収まるので、 様々な言語で扱える。
  32. 32. C-考察2 ● Nが大きいと N!/Kを陽に持つことは出来な い。
  33. 33. C-考察2 ● Nが大きいと N!/Kを陽に持つことは出来な い。 ● やりたい操作は – (N-1)!で割る – その余りを求める
  34. 34. C-考察2 ● Nが大きいと N!/Kを陽に持つことは出来な い。 ● やりたい操作は – (N-1)!で割る – その余りを求める 実際にやってみる
  35. 35. C-考察2 ● N!/Kを(N-1)!で割った商は – (N/K)×(N-1)! ÷ (N-1)! の商 – → N÷K の商 ● N!/Kを(N-1)!で割ったあまりは – (N/K)×(N-1)! ÷ (N-1)! のあまり – → 「N÷Kのあまり」÷ K × (N-1)! – これは 整数÷K×(N-1)! の形をしている
  36. 36. C-考察2 ● このあと2桁目を求めるときに – 整数÷K×(N-1)! を (N-2)!で割った商と余り を求めることになる。商は先ほど同様に簡単に 求めることができ、あまりは – 整数÷K×(N-2)! になる。
  37. 37. C-考察2まとめ ● 1桁目を求めるときに扱う値が 1÷K×N! ● 2桁目を求めるときに扱う値が 整数÷K×(N-1)! ● 3桁目を求めるときに扱う値が 整数÷K×(N-2)! ● 4桁目を求めるときに扱う値が 整数÷K×(N-3)! :
  38. 38. C-考察2まとめ ● 1桁目を求めるときに扱う値が 1÷K×N! ● 2桁目を求めるときに扱う値が 整数÷K×(N-1)! ● 3桁目を求めるときに扱う値が 整数÷K×(N-2)! ● 4桁目を求めるときに扱う値が 整数÷K×(N-3)! :
  39. 39. C-考察2まとめ ● 1桁目を求めるときに扱う値が 1÷K×N! ● 2桁目を求めるときに扱う値が 整数÷K×(N-1)! ● 3桁目を求めるときに扱う値が 整数÷K×(N-2)! ● 4桁目を求めるときに扱う値が 整数÷K×(N-3)! : 赤字の整数だけ保存しておくだけで済む
  40. 40. C-解法 ● 部分点1と同じ解法を、N!/Kを陽に持たずに計 算する。 ● 保存しておく整数はあまり大きくならないこと が保証される。 – 考察すると 整数÷K ≦ N となることがわかる ● 残っている数字の中でX番目に小さいものをも とめる作業はBIT上の二分探索で実装できる →計算量O(Nlog^2N) 満点獲得
  41. 41. ARC047解説 D:ナナメクエリ
  42. 42. D-問題概要 ● 全てのマスが0に初期化されたN×Nの方眼紙上 で以下のクエリをQ個処理せよ。 ● 1:A≦ X+Y ≦ Bとなるマス(X,Y)にCを足す ● 2:A≦ X-Y ≦ Bとなるマス(X,Y)にCを足す ● 3:A≦X≦ B,C≦Y≦Dとなるマス(X,Y)の範囲内の 最大値とその個数を求める ● N,Q≦5,000
  43. 43. D-部分点解法 ● N ≦ 50 ● 指示通りシミュレートする ● 一度のクエリで参照する必要のマスは最大で 2500個程度 ● 充分少ないので間に合う ● O(N^2Q)10点獲得
  44. 44. D-考察 ● sum[i] := 「X+Y=iとなるマス(X,Y)にクエリ1で 足された値の総和」 ● dif[i] := 「X-Y=iとなるマス(X,Y)にクエリ2で足 された値の総和」 という2つの変数を用意する。 ● sum[X+Y]とdif[X-Y]がわかればマス(X,Y)の値も すぐわかる。
  45. 45. D-考察 ● sum[X+Y]とdif[X-Y]がわかればマス(X,Y)の値も すぐわかる ● クエリ1とクエリ2はO(N)で処理できる ● 問題はクエリ3
  46. 46. D-考察 ● クエリ3の範囲のなかでとりうるX-Yの値は連 続している。 ● 右図のような範囲の場合 X-Yは-3~2の値を取る
  47. 47. D-考察 ● X-Yの値を決めてやると、X+Yの値の範囲も決 まり、1個飛ばしの値をとる。 ● X-Y = -1とする X+Yは1~5の奇数をとる
  48. 48. D-考察 ● X-Yを決めた時に、その中で最大の値を持つマ スは、適切な範囲のsumの最大値 + dif[X-Y]と なる。 ● X-Y=-1ならば max{sum[1],sum[3], sum[5]} +dif[-1] が右線上の最大値である
  49. 49. D-偶奇でわける ● さきほどの考察で、X-Yを固定した時のX+Yの 取りうる値の範囲が連続だったら、bitやセグ メントツリーをつかってO(logN)で最大値を求 めることが出来る。 ● X+Yの範囲は連続ではないものの2飛ばしであ るため、2つセグメントツリーを作ってX+Yが 奇数のものと偶数のものを分けて管理すれば、 きっちり連続した区間になってくれる。
  50. 50. D-部分点2まとめ ● sum[i]やdif[i]を使ってマスの値を保存する ● クエリ1,2は愚直にO(N)でsumやdifを更新 ● クエリ3の時はdif[X-Y]を全通り試して、各X-Y に対して対応するX+Yに値の範囲をもとめ、セ グメントツリーで最大値とその個数をもとめ る。 ● O(NlogNQ) 30点獲得
  51. 51. D-考察 ● クエリの範囲が正方形である時を考える ● 偶奇は別々に考えていいので今回は奇数だけ考 える ● 部分点2で注目したX+Yの範囲をよく見てみる
  52. 52. D-考察 ● X-Y = -3のときX+Yの範囲は[3]
  53. 53. D-考察 ● X-Y = -3のときX+Yの範囲は[3] ● X-Y = -1のときX+Yの範囲は[1,3,5]
  54. 54. D-考察 ● X-Y = -3のときX+Yの範囲は[3] ● X-Y = -1のときX+Yの範囲は[1,3,5] ● X-Y = 1のときX+Yの範囲は[1,3,5]
  55. 55. D-考察 ● X-Y = -3のときX+Yの範囲は[3] ● X-Y = -1のときX+Yの範囲は[1,3,5] ● X-Y = 1のときX+Yの範囲は[1,3,5] ● X-Y = 3のときX+Yの範囲は[3]
  56. 56. D-観察 ● 出てきた範囲の種類は – [3] – [1,3,5] ● これを8×8で実験した場合だと – [7] – [5,7,9] – [3,5,7,9,11] – [1,3,5,7,9,11,13] となる
  57. 57. D-考察 ● 良い順番で処理するとX+Yの範囲は増えるだけ になる。 – 値が増えるだけならセグメントツリーをつかわなく ても随時maxをとるだけで最大値がわかる ● 正方形のクエリならば一辺の長さに対する線形 時間で処理することが出来る。
  58. 58. D-考察 ● クエリの範囲が長方形の時は? – 正方形に分割してやれば良い。
  59. 59. D-考察 ● クエリの範囲が長方形の時は? – 正方形に分割してやれば良い。 ● どうやって分割する? – ユークリッドの互助法の要領でできるだけ大きい正 方形を削り取るように分割していく
  60. 60. D-考察 ● 例
  61. 61. D-考察 ● 例
  62. 62. D-考察 ● 例
  63. 63. D-考察 ● 例
  64. 64. D-考察 ● 例
  65. 65. D-計算量 ● 1辺がXの正方形のクエリを処理するのにO(X) の時間がかかる ● タテとヨコの和がSの長方形から先ほどの方法 で1辺がXの正方形を剥ぎとった時、のこる長 方形のタテとヨコの和はS-X以下になる ● よって、全て正方形に分割し終えたときの総計 算量はO(S)=O(N)となり無事に線形時間で処 理が終わる。
  66. 66. D-満点まとめ ● 部分点2同様にsumとdifを作る。 ● 正方形のクエリならば線形時間で解ける。 ● 長方形のクエリでも正方形に分割すると線形時 間でとける。 ● O(NQ) 満点
  67. 67. D-満点別解(紹介のみ) ● 部分点2でセグメントツリーを使うかわりにス ライド最小和を使うことで、logを一つ取るこ とが出来る。 ● hashmap(sortされていない代わりにアクセス が定数時間であるmap)を使えば最大値の個数 を数えるのが線形時間でできるようになる

×