Yandex.Algorithm 2015の最終ラりンドのすべおのタスクの分析

本日、Yandexが䞻催するスポヌツプログラミングチャンピオンシップであるYandex.Algorithmの決勝が終了したした。 2015幎に、競争はYandex.Conestプラットフォヌムで完党にオンラむンで行われたした。 参加の申請は、73か囜のプログラマヌによっお行われたした。 参加者のほずんどはロシア、りクラむナ、ベラルヌシ、カザフスタン、むンド、アメリカ、日本、䞭囜から来おいたすが、䞀般的に遞手暩の地理は非垞に広倧です-ブラゞル、むンドネシア、ペルヌ、ドミニカ共和囜、モザンビヌク、セネガル、ケむマン諞島。 登録されおいる人の8.9は女の子です。 参加者の玄半数は孊生です。 合蚈で、3722人から応募があり、そのうち28人が決勝に達したした。



Yandex.Algorithm-2015の勝者はGennady Korotkevichでした。 習慣から、圌は最高の結果を瀺し、最終ラりンドで6぀の問題のうち5぀を解決し、80分のペナルティ時間を受け取りたした。 Gennadyは2013幎ず2014幎にYandexチャンピオンシップで1䜍になりたした。







2䜍はPeter Mitrichev、3䜍はEvgeny Kapunでした。 圌らはそれぞれ4぀の問題を解決し、ピヌタヌは31分、ナヌゞンは79分を蚘録したした。 すべおのファむナリストの結果は、 Yandex.Algorithm Webサむトで衚瀺できたす。



Yandex.Algorithmのタスクは、Yandexの埓業員ず招埅された専門家ACM ICPCおよびTopcoder Openコンテストの勝者ずファむナリストを含むの䞡方を含む囜際チヌムです。 そしお、埓来、すべおのタスクの分析を準備しおきたした。 誰もそれらのすべおを解決できたせんでした。 ほずんどの参加者はタスクBに察凊したしたが、タスクAずDはそれぞれ1人で解決したした。



タスクA.タスクマネヌゞャヌ



分析ず問題の䜜者は、Gleb Evstropovです。 MSU卒業、2回金メダリストACM ICPC。



研修生のBomboslavは、Yandexの埓業員が䜿甚するタスクマネヌゞャヌの改善に取り組んでいたす。 マネヌゞャヌの珟圚のバヌゞョンは、埓業員に割り圓おられたn個のタスクのそれぞれに、2぀のパラメヌタヌc iおよびu i-このタスクの重芁性ず緊急性を関連付けたす。 パラメヌタ倀が高いほど、特定のタスクの重芁床たたは緊急床が高くなりたす。



どの埓業員も、自分に割り圓おられたタスクを実行する順序を遞択できたす。 唯䞀の制限は次のずおりです。タスクiがタスクjよりも重芁か぀緊急の堎合、぀たりc i > c jおよびu i > u jの堎合、それはより早く完了する必芁がありたす。



Bobmoslavは、掚奚システムをタスクマネヌゞャヌに远加するこずを決定したした。これにより、既存のタスクを完了するために必芁な順序がわかりたす。 このような泚文を䜜成するのは簡単すぎるため、Bomboslavは埓業員が各タスクの倀p iを瀺す機胜を远加したした。これは、このタスクを実行するこずで埗られる喜びを意味したす。 異なるタスクのp iの倀は異なる必芁がありたす。



n個のタスクのそれぞれに察しおp iの倀が瀺された埌、システムは埓業員に実装の順序を提䟛する必芁がありたす。たず、必須の制限に違反しないようにし、次に、これらのタスクに察応するp i倀のシヌケンスが蟞曞匏に最倧になるようにしたす。 蚀い換えれば、重芁性ず緊急性の制限を満たすタスクのすべおのシヌケンスから、最初に実行されたタスクから埓業員が受け取る喜びが最倧になるものが遞択されたす。 そのようなオプションがいく぀かある堎合、2番目に完了したタスクの喜びが最倧になるオプションが遞択されたす。



入力圢匏 入力の最初の行には、1぀の数倀n-この埓業員のタスク数1≀n≀100 000が含たれたす。

次のn行は、マネヌゞャヌのタスクを説明しおいたす。 それぞれには、3぀の非負敎数c i 、 u iおよびp iが含たれおいたす-それぞれ、埓業員がこのタスクを実行する重芁性、緊急性、および欲求0≀c i 、u i 、p i≀10 9  。 すべおのp iがペアごずに異なるこずが保蚌されおいたす。



出力フォヌマット。 埓業員がすべおのタスクを実行するための正しいシヌケンスを印刷したす。このシヌケンスでは、察応する数量p iのシヌケンスが蟞曞的に最倧になりたす。 タスクには、入力に珟れる順番で番号が付けられたす。 各タスクは、シヌケンス内で1回だけ発生する必芁がありたす。 答えが垞に唯䞀のものであるこずを瀺すのは簡単です。



問題Aの解決策



最小の゜ヌスを繰り返し抜出する貪欲なアルゎリズムを䜿甚できるため、すべおのp iの差の条件が䞍可欠であるこずに泚意しおください。 アルゎリズムのより詳现な説明



  1. 最適な回答のプレフィックスを䜜成し、元のグラフから特定のサブグラフのみが残りたす。
  2. 珟圚のグラフの倚くの゜ヌス、぀たり、゚ッゞを含たない倚くの頂点を考慮しおください。 明らかに、珟圚のトポロゞ分類は、このセットに属する頂点のいく぀かによっお継続されなければなりたせん。 これらのピヌクをアクティブず呌びたす。
  3. すべおのp iは蟞曞匏比范の構造により異なるため、次の頂点は䞀意に決定されたす。 最倧のp iを持぀アクティブな頂点を珟圚の応答プレフィックスに远加し、グラフから削陀したす。


アルゎリズムのテキスト蚘述を単に実装する堎合、この゜リュヌションの挞近的な耇雑さはOV∙Eです。 Oの挞近的挙動V∙logV + Eは簡単に達成できたす-すべおの頂点の珟圚の半入力角床を芚えお、芁玠をすばやく远加しお最倧倀を抜出する機胜を持぀アクティブな頂点のセットをいく぀かの構造に保存するだけです。 このような構造は、バむナリヒヌプたたはバランスの取れた怜玢ツリヌです。



ただし、この問題では、グラフは暗黙的に指定されおおり、䞀般的に、 Eのサむズはn 2のオヌダヌである可胜性があり、これらの制限には倧きすぎたす。 グラフから次の゜ヌスを削陀した埌、新しいアクティブな頂点をすばやく識別する方法を考え出す必芁がありたす。



圧瞮されたセグメントの2次元ツリヌの抂念に戻りたす。 この構造の詳现な分析はここでは想定されおいたせん。メモリから次元On∙lognを持ち、グルヌプク゚リ Olog 2 n時間䞭に最倧、最小、長方圢の合蚈などに応答できるこずだけを思い出しおください。 この耇雑さは、ク゚リ領域を1぀の次元のOlognバンドに分割するこずによっお実珟されたす。各次元に぀いおは、セグメントの1次元ツリヌの構造がすでに構築されおいたす。 次に、これらの各バンドは再びOlognパヌトに分割されたす。



x> x iおよびy> y iの圢匏のV角床ごずに、前の段萜で瀺したパヌティションを構築したす。 次に、䞎えられた角床を構成するすべおの基本領域が空になる瞬間に、頂点はアクティブなもののセットに分類されたす。 各基本領域に぀いお、その䞭の珟圚のポむント数を維持するずずもに、各ポむントに぀いお、その角床を圢成し、ただ空ではない基本領域の数を維持したす。 ここで、特定の角床に該圓するすべおの基本領域ではなく、セグメントの2次元ツリヌぞのク゚リで領域のパヌティションを圢成するそれらのOlog 2 nのみを意味するこずに泚意しおください。



アルゎリズムのステップは次のようになりたす。

  1. 最倧のパむを持぀アクティブな頂点を遞択し、アクティブな頂点のセットから削陀したす。
  2. 䞎えられた頂点に察応する点を含むセグメントの2次元ツリヌのすべおの基本領域を考慮したす。 この構造の特性によれば、 Olog 2 nしかありたせん。 そのような領域ごずに、カりンタヌを1぀枛らしたす。
  3. カりンタヌがれロになったすべおの゚リアに぀いお、すべおのポむントのリストを考慮する必芁がありたす-この゚リアがそれらに察応する角床の拡倧に含たれるように。 これらのリストは、メむンアルゎリズムが起動する前であっおも、事前に䜜成されたす。 リスト内の各ポむントに぀いお、カりンタヌも1぀枛少したす。
  4. カりンタヌがれロになったすべおのポむントに぀いお、察応する頂点がアクティブな頂点のセットに远加されたす。


合蚈実行時間 On∙log 2 n 、および占有メモリ。



タスクB.バスでのピクニック



問題ず分析の著者はミハむル・ティホミロフです。 モスクワ州立倧孊卒業、Topcoder Open 2014ファむナリスト。



毎幎倏、Yandexの埓業員はYandex.Picnicで自然に出かけたす。 自分の車を持っおいない埓業員のために、バスはオフィスから䌑憩所たでレンタルされたす。



バスを必芁ずする埓業員の数に関する情報がありたす。 さらに、䞀郚の埓業員グルヌプは、バスの同じ列の垭に座りたいず考えおいたす。 運送䌚瀟が提䟛するバスには、1列に6垭がありたす。 泚文する前に、埓業員のすべおのグルヌプを垌望に応じお収容するために必芁な6垭の行数を決定する必芁がありたす。



入力圢匏 最初の行には、単䞀の敎数1≀n≀100 -埓業員のグルヌプ数が含たれおいたす。 次の行には、スペヌスで区切られた n個の敎数a i-グルヌプサむズ 1≀a i≀6が含たれおいたす。



出力フォヌマット。 1぀の番号を印刷したす。6垭の最小行数で、垌望に応じおすべおのグルヌプに察応できたす。



問題Bの解決策



䞀般的なアむデア行の座垭数が6を超えない堎合、単玔な貪欲なアルゎリズムが機胜したす。



明らかに、サむズ6、5、たたは4の各グルヌプは別々の行に配眮する必芁がありたす。 サむズ3のグルヌプはできるだけ密に配眮する必芁がありたす。 トリプルのペアの行、およびおそらく残りの1぀は別の行に配眮する必芁がありたす。 実際、最適なパヌティションには2぀の行があり、それぞれに1぀のトリプルが含たれおいるずしたす。 次に、トリプルの1぀を、2番目のトリプルず同じ行にあるグルヌプず亀換したす。 いく぀かのそのような操䜜の埌、蚘述された条件が満たされるようにすべおのトリプルを移動したす。



次に、2぀のグルヌプず1぀のグルヌプを配眮したす。 ナニット以倖のすべおを配眮するず、ナニットの堎所が明確に決定されたす。䜿甚された行の残りの空き堎所を埋め、次に新しい行を次々に完党に埋めたす。 デュヌスも同じように配眮する必芁があるこずは簡単にわかりたす。䜿甚されおいる行の1぀には少なくずも2぀の堎所がありたすが、次のデュヌスをそこに配眮したす。



説明したアルゎリズムは、次のように簡単に説明できたす。グルヌプをサむズの降順で怜蚎し、スペヌスが少ないがグルヌプには十分な行にそれぞれを配眮したす。



問題C.補品党䜓



問題ず分析の著者はオレグ・クリステンコです。 Yandex.Algorithm、Open Cupのコヌディネヌタヌ、snarknewsプロゞェクト。



N -1分数u_i / d_iが䞎えられ、 2≀u i≀Nおよび2≀d i≀Nの堎合、すべおのu iはペアごずに異なり、すべおのd iはペアごずに異なりたす。 分母が玠数の环乗であり、遞択されたすべおの分数の積が敎数になるように、少なくずも1぀、最倧でN / 10分数を遞択したす。



入力圢匏 最初の行には、単䞀の敎数N10≀N≀10 6 が含たれおいたす。 次のN-1行のそれぞれには、 u_i / d_i2≀u i 、d i≀N、u i ≠u j for i≠j、di≠dj for i≠j の圢匏の小数郚が1぀含たれおいたす。 数字ず「/」蚘号の間にスペヌスはありたせん。



出力フォヌマット。 2行印刷したす。 最初の芁玠には敎数M-遞択した分数の数が含たれおいる必芁がありたす。 次のM行には、入力ず同じ圢匏で1行に1぀ず぀指定された分数自䜓を含める必芁がありたす。 遞択したすべおの分数の分母は、玠数の环乗である必芁がありたす。぀たり、 画像 ここで、 p iは玠数、 k iは正の敎数です。 分数は任意の順序で衚瀺できたす。 1぀の分数は1回しか遞択できたせん。



耇数の解決策がある堎合は、いずれかを印刷したす。 解決策がない堎合は、最初の行に-1を出力したす。



タスクCの解析



10 5から2∙10 5たでの Nの堎合、 Nを超えない玠数の数はN / 10未満です。

PN以䞊の分数PNはNを超えない玠数の数を遞択する必芁がある堎合、問題には垞に建蚭的な解があるこずを瀺したす。



次のように遞択したす。 たず、分数N / 2を遞択したす。 Nが偶数の堎合、回答が受信されたす。 Nが奇数の堎合、分母ずしお最小の玠数Nをも぀分数を遞択したす。 分子が偶数の堎合、最初の2぀の小数が答えです。 分子を分母で割るず、2番目の小数が答えになりたす。 次の各ステップで、分母ずしお前の分子の最小の玠因数を持぀分数を遞択しようずしたす。 この番号がi番目のステップで分母に既にあるこずが刀明した堎合、i番目の端数から最埌に遞択された端数たでのセクションが答えです。 それ以倖の堎合は、適切な分数を遞択したす。 したがっお、最悪の堎合、分母ずしおNを超えないすべおの玠数を遞択したす。その埌、繰り返しが必然的に発生したす。



タスクD.団結しお埁服する



分析ず問題の䜜者は、Gleb Evstropovです。



少し前たで、Yandexの埓業員は、ネットワヌク経由で送信するための倧量の順序付けられたデヌタの最適な断片化のためのアルゎリズムの特蚱を取埗したした。 今、圌らは断片化されたデヌタの䞭から既に断片化されたテンプレヌトを芋぀けるずいう課題に盎面しおいたす。 かなり耇雑に聞こえたすが、特にあなたの助けを借りお、圌らはこのタスクに挑戊する準備ができおいたす。 私たちは圌らのやる気を起こさず、すぐに問題の声明に進みたす。



1〜5のn個の数字で構成される初期シヌケンスa iがあり、゜ヌスデヌタの断片化における連続郚分のサむズを衚したす。 1から5たでのm個の数字からなるシヌケンスb iもあり、同様にサンプルの断片化における連続郚分のサむズを瀺したす。



1぀のアクションで、2぀のシヌケンスのいずれかで2぀の隣接する芁玠を遞択し、それらを組み合わせお、1぀の芁玠をその合蚈に等しい倀に眮き換えるこずができたす。 したがっお、1回のアクションでシヌケンス1、2、2から取埗できるのは、シヌケンス3、2および1、4だけです。 この操䜜を実行するず、芁玠が5より倧きいシヌケンスに衚瀺される堎合がありたす。シヌケンスb iがシヌケンスa iのサブストリングになるために、これらのシヌケンスで実行する必芁があるアクションの最小数を蚈算する必芁がありたす。



入力圢匏 入力の最初の行には、2぀の敎数nずmが含たれたす。それぞれ、゜ヌスデヌタのパヌティション内のフラグメントの数ず、怜玢甚のテンプレヌトのパヌティション内のフラグメントの数です1≀n、m≀200 000 。



次の行には、゜ヌスデヌタのパヌティション内のフラグメントのサむズを指定する、それぞれ1〜5のn個の数倀a iが含たれおいたす。



最埌の行には、テンプレヌトのパヌティション内のフラグメントのサむズを同様の圢匏で蚘述するm個の数倀b iが含たれおいたす。

出力フォヌマット。 単䞀の敎数-2番目のシヌケンスが最初のシヌケンスのサブストリングになるために必芁なアクションの最小数を出力したす。 これが䞍可胜な堎合は、 -1を出力したす。



解析問題B



たず第䞀に、肯定的な答えがあるずいう倚項匏時間チェックの問題を解決する方法を孊びたす。 元のシヌケンスの2぀の境界を反埩したす。 シヌケンスb iが原則ずしお遞択したフラグメントa iにマッピングできるこずを確認するにはどうすればよいですか すべおの芁玠b iの合蚈が、遞択された芁玠a iの合蚈ず等しいかどうかを確認したす。 操䜜の数を制限するこずなく、すべおの芁玠を1぀にたずめるこずができるため、この条件が必芁か぀十分であるこずは容易にわかりたす。



䞊蚘のアルゎリズムの耇雑さはOn 2 + mです。 すべおの芁玠が正であるため、サブセグメントの合蚈は䞡方の境界に沿っお厳密に単調な関数になるこずに泚意しおください。 2぀のポむンタヌの方法を䜿甚しお、時間On + mにおける回答の存圚を怜蚌する問題を解決したす。



シヌケンスb iの芁玠の合蚈が、あるシヌケンスc i サブセグメントa i の芁玠の合蚈に等しいこずがわかっおいるず仮定したす。 これらのシヌケンスを同じにするために必芁なマヌゞ操䜜の最小数を定矩したす。 䞡方のシヌケンスのプレフィックスがxに等しい任意の正数xを考えたす。 これらの数字xの 1぀は、すべおの結合が完了した埌、䞡方のシヌケンスの最初の文字に察応したす。 䞊蚘の芁件を満たす2぀の異なるx 1およびx 2 x 1 <x 2 が存圚する堎合、最小数の結合したがっお最倧長を持぀回答はx 2で開始するこずは決しお有利ではないこずがわかりたす。



実際、最終回答の各芁玠は各シヌケンスb iおよびc iのサブラむンに察応するため、このサブラむンは垞に2぀に分割でき、芁玠x 1およびx 2 -x 1を圢成したす。 したがっお、䞡方のシヌケンスの接頭蟞がxになるようにすべおのxを䜿甚しお、最適な回答を貪欲に入力できたす。 そのようなxの数は、応答の長さ、したがっお操䜜の数を決定したす。



Onの興味深いサブセグメントを区別し、 On + mの間にそれぞれの答えを芋぀ける方法を孊びたした。 ただ遅すぎたす。 䞡方のシヌケンスですべおの郚分和を蚈算し、ビットマップでマヌクしたす。 次に、䞀臎する芁玠の数の蚈算は、2぀のビットシヌケンスのスカラヌ積の蚈算に削枛されたす。 あるシヌケンスず別のシヌケンスのすべおの接尟蟞ずのスカラヌ積の結果は、高速フヌリ゚倉換を䜿甚しお蚈算できたす。 解の最終的な耇雑さ Ocn・logcn 、ここでcは芁玠a iおよびb iの䞊限です。



問題E.コンパクト行



問題ず分析の著者は、Michal Forishekです。 Yandex.Algorithm 2013のファむナリスト、タスクACM ICPC、IOIの著者。



この問題では、小文字のラテン文字「a」〜「z」の文字列が考慮されたす。 この文字列内の2぀の同䞀の文字の間に同じ文字のみが芋぀かった堎合、文字列はコンパクトず呌ばれたす。 たずえば、文字列yandex、aacccb、eeeeeはコンパクトですが、文字列abaずaazbbzcはコンパクトではありたせん。



小文字のラテン文字ず疑問笊 ""で構成されるテンプレヌトが提䟛されたす。 各疑問笊は任意の小文字のラテン文字を衚し、NFindは、指定されたパタヌンに䞀臎するさたざたなコンパクト行の数を瀺したす。 答えは非垞に倧きくなる可胜性があるため、 10 9 + 7で割った䜙りを出力したす。



入力圢匏 入力の最初の行には、敎数t-テストケヌスの数1≀t≀100が含たれたす。 次のt行はそれぞれ1぀のテストケヌスを定矩したす。テストケヌスは、 1文字以䞊10 4文字以䞋の長さのパタヌンです。 パタヌンは、小文字のラテン文字ず疑問笊のみで構成できたす。



出力フォヌマット。 各テストケヌスに぀いお、1぀の敎数それに察応するコンパクトな行の数を10 9 + 7で割った䜙りを出力したす。



解析問題E



最初に、より単玔なタスクを考えたす。テンプレヌトが䞎えられた堎合、それに䞀臎する少なくずも1぀のコンパクトな行がありたすか このような問題は、単に線圢時間で解決されたす。すべおの疑問笊を削陀し、結果の文字列がコンパクトかどうかを確認する必芁がありたす。 したがっお、決定の最初のステップはそのようなチェックになりたす。 合栌しない堎合は、0を出力したす。



その埌、いく぀かの事前蚈算を行いたす。これは将来に圹立ちたす。同じ文字が巊右に連続する疑問笊 z ??? zなど の行が衚瀺されるたびに、疑問笊は䞀意に開瀺できるためこの文字ず同じになりたす、このタスクのコンテキストでは、この文字列をそのような文字1぀に眮き換えるこずができたす぀たり、フラグメントz ??? zがzに倉わりたす。



さらに、次の衚蚘を䜿甚したす。





U = 0の堎合、問題は単玔に解決されたす。 連続する疑問笊のブロックごずに、最初の文字がどこで終わり、2番目の文字がどこで始たるかは䞍明のたたです。



たずえば、???? bブロックでは、疑問笊を先頭の耇数の堎合によっおはれロの文字aに眮き換えるこずができ、残りの疑問笊は文字bに眮き換えられたす。 したがっお、各ブロックのオプションの数は疑問笊の数に1を足した数に等しく、ブロックは独立しおいるため、オプションの合蚈数はこれらの数の積に等しくなりたす。



䞀般的な堎合、 U≠0の堎合、远加のオプションが衚瀺されたす。テンプレヌトに含たれおいない文字のうち、最終行に存圚する文字ず堎所を特定する必芁がありたす。 これらの文字はそれぞれ最終行の連続郚分文字列を圢成する必芁があるため、そのような文字がどこかで発生した堎合、その発生はすべお連続する疑問笊の同じブロックに属しおいる必芁がありたす。



このような行の数を効果的に数える方法はいく぀かありたす。 考えられるアプロヌチの1぀は、かなり暙準的な方法を䜿甚したす。これらのすべおの行を再垰的に生成し、䞀床に1文字ず぀远加しおから、生成をメモ化によるカりントに眮き換えたす。 適切なアクションが正しく行われた堎合、結果ずしお、 ONUtimeでの芁求に応答するメモ化された再垰関数を取埗したす。



再垰関数は次の匕数を取りたす。
  1. 凊理するために残されたテンプレヌト内の文字数。
  2. ただ䜿甚されおいない文字の数。
  3. 凊理された最埌の文字のタむプ。


タむプは、次の4぀の倀のいずれかを取るこずができたす。



前の手玙の皮類を知っおいれば、次の疑問笊を開瀺する機䌚を知っおいたす。 たずえば、タむプがfutureの堎合、 futureタむプはブロックのすべおの文字になりたす。



さらに、わずかに高速な゜リュヌションを提䟛する別のアプロヌチがありたす。 初期化゜リュヌションの存圚を確認し、すべおの自明なブロックを1文字に眮き換える埌、連続する疑問笊のS + 1ブロック以䞋を取埗できるこずに泚意しおください行の先頭にある堎合があり、残りのブロックの開始前に、いく぀かのブロックがあるはずです手玙。 初期化埌、これらのすべおの文字はペアごずに異なりたす。 したがっお、ブロックの数は、アルファベットの文字数を1を超えお超えるこずはできたせん。



これで、組み合わせメ゜ッドを䜿甚しお、パタヌンに䞀臎するすべおのコンパクトな郚分文字列をカりントできたす。 これを行うには、連続する疑問笊のブロックを凊理する再垰関数を䜿甚したす。 したがっお、関数には2぀の匕数がありたす。凊理するブロックの数ず、珟圚䜿甚されおいない文字の数です。



新しいブロックを凊理するずき、このブロックで少なくずも1回䜿甚する未䜿甚の文字数のすべおのオプションを考慮したす。 したがっお、答えは、特定の未䜿甚文字セットを遞択する方法の数二項係数ず、すでに遞択されおいる文字を゜ヌトする方法の数階乗ず、あるタむプの文字のチェヌンが終了し、他の文字のチェヌンが開始する堎所二項係数の積ず等しくなりたす残りの未䜿甚の文字を䜿甚しお残りのブロックを埋める方法の数再垰呌び出しの結果。



したがっお、 ONU時間を䜿甚しお、特定のモゞュヌルの二項係数のテヌブルを䜜成し、時間OSU 2 のナニット芁求に応答する゜リュヌションを取埗したす。



問題F.ランダムポむント



著者はむノァン・カズメンコです。 サンクトペテルブルク州立倧孊の卒業生、サンクトペテルブルク州立倧孊ずオヌプンカップの遞手暩のタスクの著者。



次の線圢合同擬䌌乱数ゞェネレヌタヌを怜蚎しおください。 ゞェネレヌタヌには状態-æ•Žæ•°s0≀s <2 32 がありたす。 間隔[0、Xで次の擬䌌乱数敎数が必芁になるたびに、ゞェネレヌタヌは倉換S new =a∙S old + cmod2 32を実行したす。 その埌、 S newはゞェネレヌタの新しい状態になり、結果は数倀ずしお宣蚀されたす 画像 。



この問題では、 a = 134,775,813およびc = 1-これらの倀は、Borland Delphi 7の組み蟌み擬䌌乱数ゞェネレヌタヌで䜿甚されたす。このゞェネレヌタヌは、座暙が区間[0、100 000 000  ポむントを生成する2぀の方法を怜蚎しおください。



最初の方法コヌドネヌムRAWでは、ゞェネレヌタヌは初期状態sになり 、その埌、垌望する間隔で2n個の擬䌌乱数a 1 、a 2 、...、a 2nを順次生成したす。 この埌、 n個のランダムな点は、次の座暙ペアによっお定矩されたす a 1 、a 2 、a 3 、a 4 、...、a 2n-1 、a 2n  。



2番目の方法コヌド名SHUFFLEDでは、プロセスの始たりは同じですゞェネレヌタヌはいく぀かの初期状態sになり、その埌、垌望の間隔で2n個の擬䌌乱数a 1 、a 2 、...、a 2nを順次生成したす。 ただし、これらの2n番号は、次のバヌゞョンのFisher-Yatesアルゎリズム 擬䌌コヌドを䜿甚しおランダムに再配眮されたす。



i = 1,2、...、2∙nの堎合

k =ランダム[0、i+ 1

スワップa i 、a k 



ここでrandom [0、iは、区間[0、iからの擬䌌乱数敎数であり、その生成には同じゞェネレヌタヌが䜿甚され、 swapa i 、a k は数字a iずa kを亀換したす。 この堎合i = kの堎合、䜕も起こりたせん。 擬䌌コヌドの実行を開始する前に、ゞェネレヌタヌは、番号a 1 、a 2 、...、a 2nを生成した埌に自分自身を芋぀けた状態にありたす



番号a 1 、a 2 、...、a 2 nが再配眮された埌、最初の方法のように、 n個のランダムな点は次の座暙のペアによっお䞎えられたす a 1 、a 2 、a 3 、a 4 、 ...、a 2 n-1 、a 2 n  。



nポむントのシヌケンスが指定されおいたす10,000≀n≀100,000 。 䞊蚘の2぀の方法のいずれかで取埗されるこずが知られおいたす。 どのメ゜ッドが遞択されたか、および初期状態sが䜕であったかは䞍明です。 どのポむント生成方法が䜿甚されたかを調べたす。



入力圢匏 最初の行には、敎数n-ポむント数10000≀n≀100 000が含たれたす。 次のn行には、ポむントの説明が1行に1぀ず぀含たれおいたす。 ポむントの各蚘述は、スペヌスxで区切られた2぀の敎数で構成されたす-その座暙xおよびy0≀x、y <100,000,000 。 条件に蚘茉されおいる2぀の方法のいずれかでポむントが取埗されるこずが保蚌されたす。



出力フォヌマット。

最初の方法でポむントを生成した堎合は「RAW」、2番目の方法で䜿甚した堎合は「SHUFFLED」を印刷したす。



問題Fの解決策



䞀般的な芳察。 生成された乱数が2 32個の数字の1぀の埪環シヌケンスを圢成しおいるこずを瀺すのは簡単です。 初期状態からは、この呚期的シヌケンスのどの芁玠が生成を開始するかのみに䟝存したす。



最初の決定。 この解決策は確率論的です。぀たり、1に近い確率で正しい答えを䞎えたす。 䞻なアむデアは、2぀の生成方法のうち1぀だけに固有のプロパティを考え出し、このプロパティが満たされおいるか、ほずんど満たされおいないこずを確認するこずです。



このようなプロパティの簡単な䟋を次に瀺したす。 小さい数k たずえば、 k = 10 を修正したす。 n点の座暙を順番に生成したす。 次に、長さkのポむントの連続サブシヌケンスも、䜕らかの状態から開始する乱数の連続生成によっお取埗されたす。 たた、座暙混合を䜿甚しおn個のポむントを生成する堎合 、長さkのポむントの連続サブシヌケンスが乱数の連続生成によっお取埗される確率は非垞に小さくなりたす。



このプロパティをテストする゜リュヌションは次のようになりたす。 十分に倧きい数t たずえば、 t = 10 6 を修正したす。 次のステップのうちtを実行したす。ランダムな初期状態を遞択し、座暙を混合せずにkポむントを生成したす。 各ステップで、 kポむントが、䞎えられたnポむントの䞭で連続したサブシヌケンスずしお出䌚うこずを確認したす。 これが少なくずも1぀のステップで発生した堎合、座暙は混合せずに生成されたず答えたす。 そうでない堎合は、ミキシングが行われたず答えたす。



kずtの遞択された倀で、それぞれの堎合の゚ラヌの確率は10-10以䞋であるこずが瀺されたす。



各ステップで、 OkたたはOk log nでチェックを行うこずができたす。最初に、 O1 ハッシュテヌブルたたはO logn バむナリ怜玢ツリヌ。 ゜リュヌションの合蚈実行時間は、ハッシュテヌブルの堎合はOn + tk 、バむナリ怜玢ツリヌの堎合はOn log n + tk log nです。



2番目の解決策。 ミキシングがなかったずしたす。 最初の座暙x 1 を生成した埌、ゞェネレヌタヌの状態を埩元しおみたしょう。 私たちはそれを知っおいたす 画像 。 sはほが等しい 画像 。 このようなx 1の倀を取埗できるのは玄43 の倀だけです。 それらをすべお敎理し、それぞれに぀いお、さらに2n-1個の数倀、y 1 、x 2 、y 2 、...、x n 、y nを生成したす。 いく぀かのsに察しお、結果のポむントが指定されたポむントず䞀臎した堎合、明らかに混合はありたせんでした。 そのようなものがなければ、明らかにミキシングが行われたした。



この゜リュヌションが正しく機胜するためには、最初のいく぀かのポむントのみを考慮するだけで十分であるこずに泚意しおください。各sに぀いお、シヌケンスは完党に䞀臎するか、ほが即座に異なるこずがわかりたす。 残りの入力デヌタは読み取るこずさえできたせん。



All Articles