同期 - Synchronization

Similar documents
Microsoft PowerPoint - ad11-09.pptx

Microsoft PowerPoint - algo ppt [互換モード]

Microsoft PowerPoint - algo ppt [互換モード]

…好きです 解説

プログラム言語及び演習Ⅲ

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

Microsoft PowerPoint - DA2_2017.pptx

Microsoft PowerPoint - DA2_2018.pptx

PowerPoint Presentation

PowerPoint プレゼンテーション

Microsoft PowerPoint - 05.pptx

040402.ユニットテスト

Microsoft PowerPoint - DA2_2019.pptx

始めに, 最下位共通先祖を求めるための関数 LcaDFS( int v ) の処理を記述する. この関数は値を返さない再帰的な void 関数で, 点 v を根とする木 T の部分木を深さ優先探索する. 整数の引数 v は, 木 T の点を示す点番号で, 配列 NodeSpace[ ] へのカーソル

PowerPoint プレゼンテーション

離散数学

Microsoft PowerPoint - DA2_2017.pptx

簡単な検索と整列(ソート)

論理と計算(2)

測量試補 重要事項

Microsoft PowerPoint - mp13-07.pptx

講義 1 てくにっく

( 表紙 )

Microsoft PowerPoint - 13approx.pptx

Microsoft PowerPoint - 09re.ppt [互換モード]

平成 24 年度岡山県学力 学習状況調査 数学解答類型分類表 解答類型分類にかかる留意事項 数学における学習到達度をみることが目的であるので, 誤字脱字などの文字表現の不備については, 広く許容する 基本的に意図が伝われば許容する 文章表現についても広く許容する てにをはの誤りや

2014年度 信州大・医系数学

2013年度 九州大・理系数学

Microsoft PowerPoint - 10.pptx

Boost.Preprocessor でプログラミングしましょう DigitalGhost

離散数学

Microsoft PowerPoint - ca ppt [互換モード]

データ構造

今回のプログラミングの課題 ( 前回の課題で取り上げた )data.txt の要素をソートして sorted.txt というファイルに書出す ソート (sort) とは : 数の場合 小さいものから大きなもの ( 昇順 ) もしくは 大きなものから小さなもの ( 降順 ) になるよう 並び替えること

次に示す数値の並びを昇順にソートするものとする このソートでは配列の末尾側から操作を行っていく まず 末尾の数値 9 と 8 に着目する 昇順にソートするので この値を交換すると以下の数値の並びになる 次に末尾側から 2 番目と 3 番目の 1

計算幾何学入門 Introduction to Computational Geometry

Microsoft PowerPoint - 06.pptx

Microsoft PowerPoint - ppt-7.pptx

Microsoft PowerPoint - mp11-06.pptx

2017年度 長崎大・医系数学

Microsoft PowerPoint - 4.pptx

平成 31 年度 豊島岡女子学園中学校 < 第 3 回 > 算数 くわしい解説 すぐる学習会 1 (1) イ ア ウ ア = = イ = 1 - = ウ = = (2) 工

論理と計算(2)

多変量解析 ~ 重回帰分析 ~ 2006 年 4 月 21 日 ( 金 ) 南慶典

フィルタとは

memo

2015年度 金沢大・理系数学

Microsoft PowerPoint - 13.ppt [互換モード]

A Constructive Approach to Gene Expression Dynamics

.( 斜面上の放物運動 ) 目的 : 放物運動の方向の分け方は, 鉛直と水平だけではない 図のように, 水平面から角 だけ傾いた固定した滑らかな斜面 と, 質量 の小球を用意する 原点 から斜面に垂直な向きに, 速さ V で小球を投げ上げた 重力の加速度を g として, 次の問い に答えよ () 小

Microsoft PowerPoint - H20第10回最短経路問題-掲示用.ppt

2018年度 岡山大・理系数学

4-4 while 文 for 文と同様 ある処理を繰り返し実行するためのものだが for 文と違うのは while 文で指定するのは 継続条件のみであるということ for 文で書かれた左のプログラムを while 文で書き換えると右のようになる /* 読込んだ正の整数値までカウントアップ (for

alg2015-6r3.ppt

破壊の予測

Microsoft Word - COMP-MATH-2016-FULLTEXT.doc

データ構造

ネットワーク工学演習 解答編 典型的な IP アドレス問題と解答を示す 解き方をよく覚えるように N 科 ある PC がある ネットワークの設定をみると IP アドレスが であり サブネットマスクは である 下記について解答せよ [1]

計算機シミュレーション

情報量と符号化

ひっかけ問題 ( 緊急対策ゼミ ) ステップ A B C D 39.4% 学科試験パーフェクト分析から ひっかけ問題 に重点をおいた特別ゼミ! 2 段階 出題頻度 39.4% D ゼミ / 内容 *(2 段階 24.07%+ 安知 15.28%=39.4


<4D F736F F D2094F795AA95FB92F68EAE82CC89F082AB95FB E646F63>

測量試補 重要事項

7 ポインタ (P.61) ポインタを使うと, メモリ上のデータを直接操作することができる. 例えばデータの変更 やコピーなどが簡単にできる. また処理が高速になる. 7.1 ポインタの概念 変数を次のように宣言すると, int num; メモリにその領域が確保される. 仮にその開始のアドレスを 1

戦略的行動と経済取引 (ゲーム理論入門)

横浜市環境科学研究所

Microsoft Word - 中村工大連携教材(最終 ).doc

Microsoft PowerPoint - H20第10回最短経路問題-掲示用.ppt

Microsoft PowerPoint - 05DecisionTree-print.ppt

Taro-解答例NO3放物運動H16

2016年度 京都大・文系数学

< 中 3 分野例題付き公式集 > (1)2 の倍数の判定法は 1 の位が 0 又は偶数 ( 例題 )1~5 までの 5 つの数字を使って 3 ケタの数をつくるとき 2 の倍数は何通りできるか (2)5 の倍数の判定法は 1 の位が 0 又は 5 ( 例題 )1~9 までの 9 個の数字を使って 3

曲線 = f () は を媒介変数とする自然な媒介変数表示 =,= f () をもつので, これを利用して説明する 以下,f () は定義域で連続であると仮定する 例えば, 直線 =c が曲線 = f () の漸近線になるとする 曲線 = f () 上の点 P(,f ()) が直線 =c に近づくこ

ステップ 2 テンプレートを はめ込む FC2 ブログ専用のセールスレターテンプレートをはめ込む方法を解説します 次のような手順です 1. テンプレートサイトにアクセス 2. セールスレターの背景色を決める 3. サンプルサイトを表示させておく ( 好みの背景色の ) 4. FC2 ブログのテンプレ

バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科

3-4 switch 文 switch 文は 単一の式の値によって実行する内容を決める ( 変える ) 時に用いる 例えば if 文を使って次のようなプログラムを作ったとする /* 3 で割った余りを求める */ #include <stdio.h> main() { int a, b; } pri

生命情報学

memo

「産業上利用することができる発明」の審査の運用指針(案)

Microsoft Word - no12.doc

Microsoft Office Excel2007(NO4中級後編 エクセルを実務で活用)

立体切断⑹-2回切り

6 関数 6-1 関数とは少し長いプログラムを作るようになると 同じ処理を何度も行う場面が出てくる そのたびに処 理を書いていたのでは明らかに無駄であるし プログラム全体の見通しも悪くなる そこで登場す るのが 関数 である 関数を使うことを 関数を呼び出す ともいう どのように使うのか 実際に見て

Microsoft PowerPoint - prog03.ppt

情報処理Ⅰ

COMPUTING THE LARGEST EMPTY RECTANGLE

Microsoft PowerPoint - kougi10.ppt

もう少し詳しい説明 1. アルゴリズムを構築するための 4 枚のサンプル画像を次々と読み込むここで重要なことは画像を順番に読み込むための文字列操作 for 文の番号 i を画像の番号として使用している strcpy は文字列のコピー,sprinf は整数を文字列に変換,strcat は文字列を繋げる

STEP 数学 Ⅰ を解いてみた から直線 に下ろした垂線の足を H とすると, H in( 80 ) in より, S H in H 同様にして, S in, S in も成り立つ よって, S in 三角形の面積 ヘロンの公式 in in 辺の長

2015年度 岡山大・理系数学

Microsoft PowerPoint SIGAL.ppt

Microsoft PowerPoint ppt

Microsoft PowerPoint - DA2_2018.pptx

Microsoft Word - ミクロ経済学02-01費用関数.doc

PowerPoint Presentation

テレコンバージョンレンズの原理 ( リアコンバーター ) レンズの焦点距離を伸ばす方法として テレコンバージョンレンズ ( テレコンバーター ; 略して テレコン ) を入れる方法があります これには二つのタイプがあって 一つはレンズとカメラ本体の間に入れるタイプ ( リアコンバーター ) もう一つ

JAPLA研究会資料 2010/9/ Excel_

PowerPoint プレゼンテーション

Information Theory

Transcription:

同期 - Synchronization JOI Open Contest 2013

問題の概要 木があり 頂点 i は最初情報 i を持っている 1 2 3 4 5

問題の概要 各辺には ON/OFF の属性があり,ON の辺を介した 2 つの頂点の持っている情報が異なると情報がコピーされて両方の頂点が同じ情報を持つようになる 1 2 3 4 5

問題の概要 最初すべての辺が OFF だが 辺の属性が変更されまくる 1 2 3 4 5

問題の概要 最初すべての辺が OFF だが 辺の属性が変更されまくる 12 12 3 4 5

問題の概要 最初すべての辺が OFF だが 辺の属性が変更されまくる 123 123 123 4 5

問題の概要 最初すべての辺が OFF だが 辺の属性が変更されまくる 123 123 123 4 5

問題の概要 最初すべての辺が OFF だが 辺の属性が変更されまくる 123 123 5 123 4 123 5

問題の概要 最初すべての辺が OFF だが 辺の属性が変更されまくる 123 123 5 123 4 123 5

問題の概要 最初すべての辺が OFF だが 辺の属性が変更されまくる 123 123 45 123 123 45 123 5

問題の概要 最後に いくつかの頂点について 持っている情報の種類数を求めたい 123 123 45 123 123 45 123 5

小課題 2 都合により小課題 2 から解説します 木が直線状になっている場合

考察 各サーバーが把握している情報はどこから来たものか を考える ( 情報と頂点を同一視してしまってもよい ) あるサーバーが持っている情報たちの由来になっている頂点たちを見ると それらは連結 証明は略しますが直感的にも明らかでしょう

考察 木が直線状になっている && 連結 情報の由来となる頂点たちを覚えておくのに 左端と右端だけ持てば十分

考察 辺が消されるときは消されたことだけ覚えておけばよい 辺が新しく増えたとき 新しい連結成分ができる ( ここで更新が入る ) 更新後 その連結成分の頂点たちの持つ範囲は同じで 今までの範囲の和集合になっている つまり その連結成分の中で 左端の min と右端の max を求めて 左端と右端をそれで更新すればよい

データ構造の問題 次のことができればうれしい ある範囲の min, max を求める ある範囲の値をすべてある値に書き換える 辺で繋がれた同じ成分内の左端と右端を求める で 辺を切ったり繋いだりする Segment Tree を使ってがんばるとできます 上の 2 つは省略するのでわからないときはチューター 蟻本などに質問してください

連結成分の管理 i 番目の要素に 頂点 i,i+1 の間に辺があれば 0, なければ 1 を割り当てた列を考える k 番目の頂点を含む連結成分の左端を探すことを考える ( 右端もまったく同じ ) といっても [x, k) の和が 0 になるような最大の x を求めるだけ Segment Tree 上の二分探索を実行すればよい O(log N)

計算量 Segment Tree を使って 1 回の辺の状態変更を O(log N) で行う O(M log N) くらい 30 点

小課題 1 Q = 1 1 つの頂点についてだけ答えを求めればよい 一般の木 もはや 頂点ごとに範囲を覚えておく方法は通用しない

時間反転 A->B と情報が伝わる という状況を B の立場から考える 赤で示した頂点が A の情報を持っていると思うことにする A B

時間反転 A->B と情報が伝わる という状況を B の立場から考える 赤で示した頂点が A の情報を持っていると思うことにする A B

時間反転 A->B と情報が伝わる という状況を B の立場から考える 赤で示した頂点が A の情報を持っていると思うことにする A B

時間反転 A->B と情報が伝わる という状況を B の立場から考える 赤で示した頂点が A の情報を持っていると思うことにする A B

時間反転 A->B と情報が伝わる という状況を B の立場から考える 赤で示した頂点が A の情報を持っていると思うことにする A B

時間反転 今の 5 枚のスライドを逆順に見てみよう! この様子を眺めていると A->B に情報が伝わることと B->A に時間反転の世界で情報が伝わることは同値 だと思えてくる

時間反転 こんなことして何がうれしいんだろう?? 小課題 1 は 1 つの頂点 P に届く情報の数を求める問題だった これは 時間反転の世界で P の持つ情報を持っている頂点の数を求めることに相当

時間反転の注意 単純に Dj の順番をひっくり返すだけではだめ 最終状態において すべての辺が使えなくなっているとは限らない 最初に Dj の後ろにダミーの変化情報を入れて 最終状態で使える辺を無くしておくとよいでしょう

情報の伝播 P から出た情報がどこまで伝わるかを求めたい P を根とする根付き木として考える 赤で示した頂点が P の情報を持っている P

情報の伝播 辺が使えるようになるとき 根側が情報を持っていて 葉側が持っていないときには葉側に伝える P

情報の伝播 辺が使えるようになるとき 根側すら情報を持っていないときは何も起きない P

情報の伝播 辺が使えなくなるときは何もしない ( 使えなくなったということだけ記録しておく ) P

情報の伝播 辺が使えるようになるとき 葉側が情報を持っていないかつ葉からさらに下へ辿れるときは辿れる限り辿る P

情報の伝播 すでに葉側が情報を持っているときは新たな情報の伝播はない P

情報の伝播 辺が使えなくなるときは何もしない P

情報の伝播 根側が情報を持ってさえいれば P に接続していなくても構わず情報を伝えてよい P

計算量の検討 この方法で P の情報がどこまで伝わるか求まる -> 時間反転により P がどの情報を持っているかわかる 同じ頂点に 2 回以上情報を伝える ( 葉に向かって辿る処理をする ) ことはない 計算量は O(N+M) 30 点

小課題 3 今までの方法で 60 点 小課題 3 が解ければ 100 点ですが この小課題はかなり難しいです アルゴリズムも難しいし 実装もかなり大変 IOI で 1 つの難しい問題に固執して 他の容易な部分点を逃すのは非常にもったいないので 戦略もかなり重要です

小課題 3 5 時間の間にこの問題で 100 点を取れなくても差し支えありません 制限時間付きコンテストでは 観賞用 です ですが 木についてこの問題から学ぶところは多いと思われます 1 度は解答を書いてみることをおすすめします ( 特に 重心分解などを書いたことのない人 )

重心分解 A->B に情報が伝わる経路は 木の上での A,B 間の単純パス 頂点をいくつか飛ばして伝わりうるときでも 飛ばさずに辺を 1 つずつ辿ることにする

重心分解 ある頂点 P を定め P を通る経路と通らない経路に分類して考える P を通らない経路は 木から P を除去して残った木たちに対して再帰的に計算を行うことにより対処可能 P を通る経路は ( 本質なんだけど ) あとで考える

重心分解 P を通る経路についての計算ができたとして P をどうやって定める? 残る木の大きさの最大値が小さくなるようにしたい 木 DP をして 除去したときに残る部分木の大きさの最大値が最小になる ものを選ぶ?

重心分解 これをやると 残る最大の木の大きさは元の半分以下になる この性質のおかげで 頂点数 N の木自体での処理の計算量が f(n) だとすると O(f(N) log N) くらいで再帰含めて計算可能 このように木を分割して再帰的に解く問題はたまにあります (ex. IOI2011 Race )

P について解く 肝心の P についての問題がまだ残ってる >< 何をしたいかというと A->P->B で情報が伝わるような経路たちを処理したい 但し A か B が P と同じ場合も考える

P について解く 次のものが求まればよさそう A が P に最初に到達する時刻 P から出発して B に到達できる最も遅い時刻 すべての頂点について P への到達時刻 P への終電の出発時刻 がわかれば この 2 つの情報をがんばってマージすると解ける

到達時刻 終電のほうは省略します 小課題 1 で考えたように 時間反転を考えるとほぼ同様に解ける 今度は 最も早い到達時刻 を求めないといけない 小課題 1 で使った手法は使えない (P からの最も早い到達時刻を求めてもどうしようもない )

到達時刻 P に到達すればいいので P を根とする根付き木で考える 他の頂点から できるだけ貪欲に P に向かう つまり できるだけ根に近いところまで情報を伝える 今回必要な情報は 各頂点について 今 どれだけ P に近いところまで情報を伝えられるか

到達時刻 頂点ごとに最善位置を管理していたら後で大変なことになる 頂点ごとに管理する情報を 今 そこに到達できているが そこから上には行けてない頂点たち のリストとする

到達時刻 横の数字は頂点番号 中の数字は その点が到達限界であるような頂点たちの番号 です P 1 1 2 2 6 6 3 3 4 4 5 5 7 7 8 8

到達時刻 辺が使えるようになるとき 葉側にある頂点たちは一斉に根側に移動する P 13 1 2 2 3 4 4 5 5 6 6 7 7 8 8

到達時刻 辺が使えなくなるとき 使えなくなったことだけ覚えておいて あとは何もしない P 13 1 2 2 3 4 4 5 5 6 6 7 7 8 8

到達時刻 辺が使えるようになるとき 13 P P に到達できるようになったらゴール その頂点たちを記録して 木から追い出す 3 1 2 2 4 4 5 5 6 6 7 7 8 8

到達時刻 辺が使えるようになるとき P 葉側に頂点がなければなにもしない 1 2 2 3 4 4 5 5 6 6 7 7 8 8

到達時刻 P 1 2 2 3 4 4 5 5 68 6 7 7 8

到達時刻 根側から さらに辺を辿って根に近づける場合は 可能な限り根に近いところまで行く 結果根に到達したら 記録して追い出す 3 1 68 P 2 2 4 4 5 5 可能な限り根に近いところまで行く 方法は後述 6 8 7 7

頂点リストの管理 各頂点の持つ頂点情報を高速に更新したい 別に頂点の順序は気にしてない 併合 空にする 列挙 だけできればよい ここでは 循環リスト が便利です ポインタがわからない人はポインタを習得するか 配列などで代用してください

循環リスト 下図のように 起点や終点がなく ポインタを辿ると同じ集団に属している頂点たちを 1 回ずつ通って自分に戻ってくる

循環リスト 赤の頂点を含む集団と 青の頂点を含む集団を併合します

循環リスト 併合といっても簡単で 行き先のポインタを swap するだけ

循環リスト リストの性質から列挙も簡単 自分に戻ってくるまで辿ればいい リストを空にするのは適当

最も根に近い頂点 使える辺だけを辿って行ける 最も根に近い頂点を求めないといけない 少なくとも 3 通りの方法があります Doubling + Euler Tour(?) Heavy-light Decomposition Link-Cut Tree Link-Cut Tree については省略します

Doubling + Euler Tour まず Doubling により 2^k だけ根に近い頂点を求められるようにします 次に Euler Tour みたいなことをして 頂点たちを列にします 1 2 5 1 2 3 2 4 2 1 5 1 3 4

Doubling + Euler Tour 木の辺が使えるときは 0, 使えないときは 1 を 対応する列上の辺に対して割り当てます 但し 青の辺に対しては -1 倍を割り当てます 1 2 5 1 2 3 2 4 2 1 5 1 3 4

Doubling + Euler Tour 頂点 A と その祖先 B について AB 間の使えない辺の数は列上での AB 間の数の和で求められます 列は BIT を使って管理しましょう 1 2 5 1 2 3 2 4 2 1 5 1 3 4

Doubling + Euler Tour Doubling しておいたので 高さ 2^k 上の頂点はすぐに求められます 十分大きい k から順に以下を繰り返します 2^k 上まで使える辺を辿っていけるか判定 行けるなら 答えに 2^k を加えて 2^k 上へ飛ぶ 行けないなら k を 1 減らす 形は少し違いますがやっていることは二分探索みたいなものです

Doubling + Euler Tour 計算量の評価 Doubling 初期化で O(N log N) 2^k 上まで行けるか判定は O(log N) それを O(log N) 回するので O(log^2 N) 重心分解の各ステップで O(M log^2 N) トータルで O(M log^3 N) 危なそう >< でも大丈夫 BIT とかは定数そんなに大きくない

Heavy-light Decomposition 辺の連続した部分を列で表す気分 ある頂点と その直接の子で部分木の大きさが最大になるようなものは heavy-edge それ以外は light-edge

Heavy-light Decomposition Light-edge を降りると 部分木の大きさが 1/2 以下になる Light-edge を降りる回数は O(log N) どの頂点からも O(log N) 個の列 (heavy-edge で結ばれた頂点たち ) を通れば根に到達できる

Heavy-light Decomposition 最も根に近い到達可能な点を探すのは 列だったらできる ( 小課題 2 でやった ) 考えるべき列はいつでも O(log N) 程度 1 つの列の処理は O(log N) O(log^2 N)? 実は 1 回あたり O(log N) にできる

Heavy-light Decomposition 列ごとに 左端 ( 一番根に近い側 ) に到達できる最も右の場所 を覚えておき 更新のときにこれも計算しなおす この値を見ると 左端まで行ける場合には O(log N) もかからなくて O(1) で左端までスキップできる

Heavy-light Decomposition まじめに O(log N) で計算するのはスキップできない最後だけ 見る列の数は O(log N) light-edge の数も O(log N) もちろん更新も O(log N) よって 1 回あたり O(log N) で解ける これならトータルで O(M log^2 N)

マージ 最後に 到達時刻の情報をマージしないといけません といってもそんなに大変じゃない 時刻 t に P を出発すればぎりぎり間に合う頂点に辿り着けるのは 時刻 t もしくはそれ以前に P に着ける頂点たち 時刻でソートしておいて適切に処理

注意 今考えているのは 経路中に P を含む組 P で切って同じ部分木に属するような組は考えてほしくない 全体に対する処理と同様にがんばって除去しましょう マージの計算量は適切に実装すれば 到達時刻 パートに比べて無視できます

注意 重心分解で再帰するときに 辺の変更情報を丸投げしないようにしましょう その部分木に関係しないものは渡さなくてよい 渡すと計算量が悪くなる

まとめ 重心分解 + 木に対するデータ構造 計算量は O(M log^3 N) or O(M log^2 N) 実は実速度はたいして変わりません これでようやく 100 点