ロシアコヌドカップ2014の予遞ラりンド結果ずタスクの分析





先週の日曜日、 ロシアコヌドカップ2014の予遞ラりンドが行われたした。 4人の資栌で最高の結果を瀺した802人のプログラマヌが参加したした。 この段階では、参加者は3時間で6぀の問題を解決しなければなりたせんでした。これは1時間であり、予遞ラりンドよりも1぀のタスクが倚くなりたす。 たた、タスクは以前のタスクよりもはるかに耇雑でした。 802の競争䞭、少なくずも1぀の問題を解決できたのは444人の参加者だけでした。 合蚈3271の゜リュヌションが送信され、そのうち1402が正しかった。



GNU C ++のほずんどの゜リュヌションは1516です。

Java 7には333の゜リュヌションがありたす。

Java 8-106゜リュヌション。



最初のタスクAは、2時52分でGennady Korotkevich芳光客によっお解決されたした。 Gennadyは、それぞれ705、2429、1305に問題B、C、Dを迅速に解決したした。 問題Eは、Dmitry EgorovDmitry_Egorovによっお最初に1分40:59に解決されたした。 問題Fはロシアコヌドカップの歎史の䞭で最も困難なものの1぀になりたした-すべおの参加者のうち、3人だけが正しくそれを解決し、最初のタスクFはRCC 2013 Petr MitrichevPetrの2:25:46で勝ちたした。



すべおのタスクを最初に完了したのは、2時間47分でPavel KunyavskiyPavelKunyavskiyでした。 3人で6個の問題が解決され、100人で5個以䞊の問題が解決されたした。 倧事にされたトップ50の最埌は、開始から2時間30分埌に5番目のタスクに合栌したRoman BilyRomaWhiteでした。



勝぀意志に぀いおは、䞊䜍50䜍に入り、7回目の詊行でタスクの1぀をパスしたEgor KulikovEgorに泚目したす。 たた、問題Cの解決方法が分からず、解決を詊みるこずを拒吊したPetr MitrichevPetrは、最も困難なタスクFを最初に解決したした。次に、タスクCに戻り、終了4分前に合栌し、合蚈3堎所。



このラりンドの参加者の領土分垃は次のずおりでした。

ロシア 515
りクラむナ 112
ベラルヌシ 77
カザフスタン 26
アメリカ 17
アルメニア 8
りズベキスタン 8
スむス 6
ドむツ 4
ラトビア 4
オヌストリア 2
ブルガリア 2
英囜 2
ゞョヌゞア 2
モルドバ 2
ポヌランド 2
シンガポヌル共和囜 2
アれルバむゞャン 1
アルれンチン 1
アむルランド 1
カナダ 1
キプロス 1
リトアニア 1
倧韓民囜 1
スロバキア 1
トルコ 1
スりェヌデン 1
日本 1
同時に、ロシアコヌドカップで初めお、オヌストリア、アルれンチン、日本からのロシア語を知らない参加者がいたした 圌らの䞀人が認めたように、圌はオンラむン翻蚳サヌビスを通じおラりンドのタスクの条件を翻蚳したした。



予遞ラりンドでの戊いは激しかった。 その結果、50人の最匷のプログラマヌが決勝に到達したした。 それらに぀いおは埌で詳しく説明したす。



タスクA.タスクの分析



アむデアアンナマロバ

実装アンドレむ・コマロフ

分析アンドレむ・コマロフ



タスクでは、解析の合蚈時間が最小限になるように、解析タスクの蚈画を䜜成する必芁がありたす。 タスクは、最初からm番目の順に゜ヌトする必芁がありたす。 1぀のタスクの解析時間はt秒です。 タスクを分析するju審員の亀代-c秒。 同じ審査員が連続しお耇数のタスクを解析する堎合、亀換は必芁ありたせん。 各ju審員は、どのタスクを凊理したいのか、どのタスクを凊理したくないのかがわかっおいたす。



この問題は、貪欲なアルゎリズムによっお解決されたす。 最初から問題の最倧数を解決できるju審員を遞択したす。 圌にk個の問題を解決する方法を教えおください。 次に、 kthから始めお、最倧数の問題を解決する方法を知っおいる人を遞択したす。 すべおのタスクが敎理されるたでこの方法を続けたす。 次に、問題の答えはm・t + q・cです 。ここで、 qは行われた眮換の数です。



なぜこれが最良の答えですか ある時点で、最倧数のタスクではなく分析したいju審員を遞択しおみたしょう。 それから、圌をもっず分解する方法を知っおいお、もっず分解する方法を知っおいる誰かに眮き換えられるずいう事実から、答えは改善するこずができるだけです。



この゜リュヌションは、 On・mで機胜したす。



動的プログラミングを䜿甚しお簡単な゜リュヌションを䜜成するこずもできたす。 dp [ i ] [ j ]は、 iタスクが逆アセンブルされ、 i番目の審査員が逆アセンブルされた堎合に費やされる最小時間に等しくなりたす。 この配列は、 On 2 mずしお簡単にカりントできたす。



問題B. 遠くアマゟンで



アむデア Vitaly Aksenov

実装 Demid Kucherenko

分析デミッド・クチェレンコ



この問題では、次の条件が満たされるn個の頂点で構成される有向グラフを䜜成する必芁がありたす。



たず、答えが「䞍可胜」であるケヌスを分析したす。 これらの条件の少なくずも1぀が圓おはたる堎合です。



そのようなグラフを䜜成できる堎合は、たず゚ッゞのチェヌンを䜜成したす。 したがっお、+ 1の女性が関䞎し、母芪ず嚘がいたす。 その埌、嚘が正確にbになるように、母芪の嚘を補完したす。 䞀郚の女性は母芪でも嚘でもない可胜性がありたすが、これは課題の条件ず矛盟したせん。



問題C. 実隓宀の物理孊



アむデア Vitalik Aksenov

実装 Artem Vasiliev

分析アルチョム・ノァシリ゚フ



この問題では、2぀の容噚の氎を冷氎ず枩氎ず混合するこずにより、どの枩床の氎が埗られるかを刀断する必芁がありたす。 特定の枩床で、このようないく぀かの芁求に答える必芁がありたした。



䜓積c iの容噚からの冷氎ず䜓積h jの容噚からの枩氎を混合する堎合、氎枩の匏を蚘述したすT = p / q =C・c i + H・h j /c i + h j この匏は、 H・q-p/p-C・q= c i / h jずなるので、問題を次のように瞮小したした既玄分数ず分子ず分母のセットが䞎えられ、分子を遞択するこずが可胜です分母が䞎えられた分数が埗られるように



すべおのc i / xのセットである衚蚘A xを導入したす。ここで、 c iはxで割り切れたす。 同様に、 B yはすべおのh i / yの集合であり、 h iはyで陀算されたす。 次に、 A pずB qが亀差する堎合にのみ、既玄分数p / qを衚すこずができたす。 すべおのセットA xおよびB yの合蚈サむズはO  M log M であるこずに泚意する必芁がありたす。ここで、 Mは血管の䜓積の制限ですこの問題では、 Mは10 5です 。



A xずB yが゜ヌトされたリストずしお衚瀺される堎合、 OM / maxx、yで1぀のク゚リを実行できたす。 A xずB yをビットセットずしお衚すず、リク゚ストごずにO  M / 64の解が埗られたす。



同じ分数の回答を数回数えないず、最速の解決策が埗られたす。 この堎合、゜リュヌション䜜業時間のより正確な掚定倀を蚌明するこずができたす。 掚定倀OM + ksqrtMを蚌明したしょう。ここで、 kはク゚リの数です。 pずqの最倧倀がsqrtMより倧きい堎合、小さい方のセットのすべおの芁玠を調べるこずで、 OsqrtMでク゚リを実行できたす。 他のすべおのク゚リの実行時間の合蚈を掚定しおみたしょう。 OM / xで実行されるク゚リは2 x以䞋です。 すべおのxを合蚈し、xがsqrtMより倧きくないこずを考慮しお、掚定倀OM + ksqrtMを取埗したす解の合蚈時間 OM + ksqrtM 。



タスクD. のこぎりの建蚭



アむデアニコラむ・ノェデルニコフ

実珟ニコラむ・ノェデルニコフ

分析ニコラむ・ノェデルニコフ



タスクでは、次のような順列の数を蚈算する必芁がありたす。



1からn ⁄ 2たでのすべおのiに぀いお、このような順列を鋞歯ず呌びたす。



このような順列の数は、隣接する数よりも奇数の䜍眮にある順列の数に等しいこずに泚意しおください。 党単射察応 b i = n-a i 。 このような順列を枛少する鋞歯ず呌びたす。 これは、問題を解決するためにさらに圹立ちたす。



明らかに、眮換の長さが0たたは1の堎合、答えは1です。



0からnたでのすべおの長さの答えがわかっおいるず仮定するず、 n +1の答えが芋぀かりたす。 ノコギリ波シヌケンスの総数を考慮したす。 増加数を取埗するには、増加数が枛少数に等しいため、シヌケンスの総数を2で陀算する必芁がありたす。



n +1を2・kに眮き、最初に長さが2・k -1の鋞歯を増やし、次に長さがn -2・k +1の鋞歯を増やしたす。 最初の2・k -1の䜍眮に぀いおは、 n個の数字のいずれかを遞択できたす。 合蚈で、数n + 1が䜍眮2・kにある長さn + 1の順列の数を取埗したす。ans 2・ k -1・ans n -2・k +1・Binom  n 、2・k -1 。



n +1を2・k +1の䜍眮に眮くず、最初に長さが2・kの鋞歯が枛少し、次にn -2・kの長さが増加したす。 最初の2・kポゞションに぀いおは、 n個の数字のいずれかを遞択できたす。 合蚈は、長さn + 1の順列の数を取埗したす。その数n + 1は、䜍眮2・k + 1で ans 2・k・ans n -2・k・Binom  n 、2・k 。



合蚈、長さn +1ののこぎり歯列の総数 ans n +1 = ∑ n k = 0 ans k・ans n − k・Binomn、k 。



タスクE. 絊䞎



アむデアアンナマロバ

実珟パベル・クロトコフ

分析パベル・クロトコフ



この問題では、有向グラフが䞎えられたす。 すべおのrib骚は3぀の郚分に分類できたす。



最初のタむプのすべおの゚ッゞず、2番目ず3番目のタむプの゚ッゞの向きに぀いおは忘れおください。 この埌、2番目のタむプの゚ッゞに沿っお互いに到達可胜な頂点を結合したす。 その埌、マニュアルの芁件を満たすこずができるかどうかを確認するタスクは、結果のグラフを2色で着色できるかどうかを確認するこずになりたす。



絊䞎ずボヌナスを亀換する必芁がある頂点の最小数を取埗するには、この怜玢を詳现に倉曎したす。 次の接続されたコンポヌネントを2色で色分けした埌、1色ず他の色でペむントされた頂点2番目のタむプの゚ッゞに沿っお結合する前の元のグラフの数をカりントし、必芁に応じお色付けを反転したす。



タスクF. ロボット



アむデア Boris Minaev

実装ボリスミナ゚フ、アルテムノァシリ゚フ

分析ボリス・ミナ゚フ、アルテム・ノァシリ゚フ



このタスクでは、フィヌルドのあるセルから別のセルぞの異なるパスの数を特定のステップ数で蚈算する必芁がありたす。 同時に、アクションを実行するロボットは、最埌のタヌンより前に最終セルにアクセスするこずはできたせん。 たた、ロボットは無限平面の4分の1だけを歩くこずができたす。



最初に、最埌の移動の前に最終セルにアクセスできないずいう条件なしで、あるセルから別のセルに移動する方法を芋぀けたす。 この問題は座暙によっお個別に解決でき、1぀の座暙で行われた移動の数ず別の座暙で行われた移動の数を反埩凊理できたす。 䞀次元の堎合の問題を解決するには ロボットは最初に座暙x 1を持ち、最埌に座暙x 2を持぀必芁がありたす。 a = | x 2 - x 1 |、合蚈tの移動が行われたした。 その堎合、さたざたなメ゜ッドの数は、 t - a / 2のtの組み合わせの数に等しくなりたす t - aは非負で偶数でなければなりたせん。 ただし、移動䞭はロボットが正の座暙しか持おないこずを考慮する必芁がありたす。 これを行うには、セルから取埗する方法の数-x 1〜x 2を結果から枛算したす。 これは、座暙の陜性の芁件に違反するx 1からのパスず-x 1からのすべおのパスずの間で1察1の察応を瀺すこずができるためです。 互いに察応するパスには、最初の郚分セル0に入るたでず共通の2番目の郚分がありたす。



二次元問題の考察に戻りたしょう。 あるセルから別のセルぞの各座暙に沿っお移動する方法の数をすでに数えたず仮定したす各固定移動距離に察しお。 2次元問題の同様の倀を蚈算するには、各座暙に費やされた時間を敎理し、既に蚈算された配列の察応する倀を乗算する必芁がありたす。たた、どの動きがどの座暙に察応するかを遞択するさたざたな方法の数を掛けたす。 これらの倀をすばやく蚈算するには、フヌリ゚倉換を䜿甚できたす。 倚項匏の乗算の問題を軜枛するには、組み合わせの数の匏に存圚するものを取り陀く必芁がありたす。 これを行うには、階乗を䜿甚しお蚘述したす。 項をグルヌプ化するず、元の配列のi番目の芁玠をi で陀算し、結果の倚項匏を乗算し、 i番目の桁の倀にi を乗算できるこずがわかりたす。 問題では、高速フヌリ゚倉換を実行できるように、すべおの操䜜を実行する必芁があるモゞュヌルが遞択されたした。



次に、ロボットが最埌の動きたで最終セルに入るこずができないずいう事実を考慮する方法を怜蚎したす。 動的プログラミングを䜿甚しお答えを怜蚎したす。 t未満の移動でセルに到達する方法の数はすでに数えられおいたす。 t移動のこれらの倀を蚈算するには、 t移動でこれを行う方法の総数を考慮し、 tの前に最終セルに入るすべおのメ゜ッドをそこから枛算したす。 これを行うには、ロボットが最埌のセルにアクセスする最初の動きの番号を敎理し、察応するりェむの数にセルを出るりェむの数 x 2 、y 2 を掛けお残りの時間に戻りたす。 同時に、ロボットは最終セルに必芁な回数だけアクセスできたす2番目の郚分。



これたでに抂説した゜リュヌションはt 2で機胜するこずに泚意しおください。 より高速な゜リュヌションを埗るには、関数を生成するずいう点で理由が必芁です。 fx= f 0 x 0 + f 1 x 1 + ... + f t x t + ...を衚したす 。ここで、 f iは答えであり、問​​題ではありたせん。 同様に、 カりントx -パスの数の生成関数を定矩したす。最埌のタヌンの最終セルぞの最初の゚ントリの条件を考慮せずに、 サむクルx -最終セルからそれ自䜓ぞのパスの数の生成関数を定矩したす。 f iの再垰関係から、生成関数ぞの関係を導出できたす fx= countx-fxcyclex 、whence fx= countx/cyclex+ 1= countxcyclex+ 1 -1 。 fを蚈算するには、右偎の分数の最初のt + 1メンバヌをカりントする必芁がありたす。 これは、 サむクルx + 1モゞュロx t + 1の逆数を蚈算し、 カりントxに結果を乗算するこずで実行できたす。 x t + 1を法ずする逆倚項匏は、高速フヌリ゚倉換を䜿甚しお時間O  t log t で取埗できたす。 合蚈実行時間 O  t log t 。



All Articles