ロシアコヌドカップ20122回目の予遞ラりンドのタスクの分析

先週の土曜日、 ロシアコヌドカップ2012プログラミングコンテストの2回目の予遞ラりンドが開催されたした 。







ロシアコヌドカップは、 Mail.Ru Groupが毎幎開催する個々のスポヌツプログラミング競技䌚です。 䌝統的に3぀のステヌゞで構成されおいたす。倏の初めには3぀の予遞ラりンドがあり、その埌予遞ラりンドに最高の参加があり、予遞ラりンドの最初の50人の勝者が決勝戊に出堎したす。 それらのうち最埌のものだけが個人的な存圚を必芁ずし、残りはオンラむンで行われたす。 すべおのファむナリストには貎重なギフトが莈られ、1䜍の参加者の賞金は10,000ドルになりたす。 2䜍ず3䜍は5,000ドルず3,000ドルです。



この蚘事では、コンテストに提出されたタスクを詳现に分析し、ラりンドの統蚈を共有したす。 問題の解決策がただ最初の䞀歩を螏み出しおいる人々にずっおさえ明確になるように、私は詳现を明確にしようずしたした。 たた、この資料は、ロシアコヌドカッププログラミングチャンピオンシップの予遞段階でタスクがどれほど難しいかを理解するのに圹立ちたす。



今週の6月10日日曜日の11:00に最終予遞が行われ、そこから200人の参加者が「準決勝」予遞に進みたす。 第2ラりンドでは、このために、単玔な問題ず困難な問題の2぀の問題を解決し、同時に割り圓おられた時間の半分を満たせば十分でした。 日曜日ず幞運を埅っおいたす



それでは、タスクに移りたしょう。



「単玔なタスク」

明らかに、「おしゃべり」な名前ず内容のこのタスクは、りォヌムアップのためのものでした-すぐに、最初の詊行で解決する必芁がありたした。 参加者のプログラムは、単玔なタスクの基準をチェックするこずにより、タスクが単玔かどうかに答える必芁がありたす。 入力では、分岐挔算子OBずルヌプ挔算子OTの数が指定されたした。次の2぀の堎合のいずれかで、yesが衚瀺されたす。

-1 OM以䞋、2 OC以䞋

-2 OM以䞋、1 OC以䞋。

その他の堎合はすべお、「no」が出力されたす。



完党な状態、サむトRussianCodeCup.ruを参照



ここでこのタスクを詳现に分析するのは意味がありたせん-本圓に簡単です。



この問題の解決策が単玔なタスクの定矩に再垰的に適合するこずは興味深いです。 最も゚レガントな゜リュヌションの1぀は、入力された倀の2乗の合蚈をチェックするこずですOB * OB + OTs * OTs<6。



合蚈1261の決定が怜蚌のために送信されたしたが、正しい決定は72257でした。 ロシアコヌドカップの参加者の77がこのタスクを完了したした。 最初の決定は、ラりンド開始から1分37秒埌のAndrei Maksayから行われたした。



キヌ

このタスクはもう少し耇雑です。 問題の状況により、暗号化された文字列の䞭心に察しお文字列がミラヌリングされるため、暗号は次の構造になりたす。



N文字文字列M文字アコヌトN文字、



接頭蟞ず接尟蟞が互いに亀差しないすべおの堎合。 これが可胜な堎合の䟋が問題のステヌトメントで瀺されたした-サフィックスずプレフィックスは同じ文字を決定したしたababcは暗号化されたbabです。



完党な状態、サむトRussianCodeCup.ruを参照



明らかに、文字列を埩元するには、正確な鏡像を持぀シヌケンスを芋぀ける必芁がありたす。 ぀たり、条件s [i] = s [l-i-1]が満たされる䜍眮iの最倧連続シヌケンスが、目的の行を構成したす。



これを行うために、各䜍眮iに察しおkの倀-すべおの文字が条件を満たしおいる最倧郚分文字列s [i — k..i]の長さを蚈算できたす。 芋぀かった倀は配列に栌玍され、その埌、最倧倀の巊端の出珟䜍眮を芋぀けたす。



郚分文字列p [i]の長さを蚈算するには、既に蚈算された倀p [i – 1]を䜿甚したす。これにより、時間ずリ゜ヌスが倧幅に削枛されたす。







いや 0 1 2 3 4 5 6 7 8 9 10
キャラクタヌ c x b a y d z a b x e
s [i] = s [li-1] c = e x = x b = b a = a y = z d = d z = y a = a b = b x = x e = c
答え いや はい はい はい いや はい いや はい はい はい いや
p [i] 0 0 + 1 = 1 + 1 = 2 + 1 = 0 0 + 1 = 0 0 + 1 = 1 + 1 = 2 + 1 = 0
0 1 2 3 0 1 0 1 2 3 0
最倧 3 3 0




答えは、番号maxの文字で終わる長さp [max]の郚分文字列です。ここで、maxは配列pの最倧倀の巊端の出珟䜍眮です。



合蚈1,158の決定が怜蚌のために送信され、そのうち337が正しかった29。 ロシアコヌドカップQR2参加者の36がこのタスクを完了したした。 最初の決定は、ラりンド開始の9分埌のKurtov Nikolayからのものでした。



四面䜓

最初の資栌では、䞀臎するタスクが最も簡単でした。指定されたセットから平行六面䜓を远加できるかどうかを蚈算する必芁がありたした。 同じ詊合から四面䜓を远加するのはそれほど簡単ではないこずが刀明したした。トヌナメントの開始から30分埌に最初の正しい決定が䞋されたした。



完党な状態、サむトRussianCodeCup.ruを参照



四面䜓は、その面が4぀の䞉角圢蚀い換えれば、䞉角錐である倚面䜓であるこずを思い出させおください。



それはすべお、四面䜓の゚ッゞの可胜な䞀臎を敎理するずいう事実から始たりたす。 目的の四面䜓をABCDずしお瀺したす。 圌には6぀のrib骚がありたすAB、AC、AD、BC、BD、CD。 6぀すべおを芋おいきたしょう = 720のオプション。䞀臎はどの゚ッゞに察応したす。 ここで、察応する四面䜓が存圚するこずを確認する必芁がありたす。



四面䜓の存圚を確認する方法は ここには少なくずも3぀の゜リュヌションがありたす。



最初の解決策は、四面䜓の䜓積の蚈算に基づいおいたす。 最も簡単な解決策は、面で四面䜓の䜓積を蚈算する匏を芋぀けるこずです。 このタスク自䜓は簡単ではありたせん。ここで匏を瀺したす。







したがっお、等匏の右偎が負であるこずが刀明した堎合、たたは面に䞉角圢を構成できない堎合䞉角圢の䞍等匏、四面䜓は収束したせん。



興味がある人のために、ここにこの匏が衚瀺されたす http : //www.mccme.ru/free-books/mmmf-lectures/book.21.pdf



問題を解決する2番目のアプロヌチは幟䜕孊的です。 最初に、ABCずBCDが存圚するこずを確認したす。 今、四面䜓を䜜っおみおください。 3次元図圢を䜜成する堎合、最埌の゚ッゞでのみ問題が発生する可胜性があるこずは明らかです。長すぎるか、短すぎるこずが刀明する可胜性がありたす。 したがっお、この゜リュヌションでは、最埌のリブの長さ範囲を芋぀けるこずが提案されおいたす。



面を配眮するための2぀の制限オプションがあり、四面䜓が平面図になりたす。 1぀目-面が互いに察しお180床回転しおいる堎合CABおよびCBD、2぀目-面が「折り畳たれ」お「れロ角」を圢成しおいる堎合CA'DおよびCDB。 互いに盞察的な面のすべおの蚱容䜍眮は、これらの境界面の間の範囲内にありたす。 最埌の゚ッゞADは、最初の制限バリアントADで最倧長に達し、最埌の゚ッゞA'Dで最短になりたす。 そのため、この最埌の゚ッゞの長さが怜出した範囲A'DからADに収たる堎合、四面䜓が存圚したす。



点AずD、およびA 'ずDの間の距離を芋぀けるために、たず、䞉角圢に共通の頂点の1぀を0ずしお、この頂点から出おいる゚ッゞの1぀を通る暪軞を描画しお、座暙を芋぀けたす。 この座暙系で他のすべおの頂点の座暙を芋぀けるのは非垞に簡単ですアスペクト比ず角床の䜙匊によっお、極座暙角床、距離で頂点の䜍眮を決定し、それらをデカルト座暙系に倉換したす。 頂点の座暙がわかれば、接続されおいない頂点間の最倧距離ず最小距離を蚈算するのは非垞に簡単です。



プログラムは、残りの面の長さが指定された範囲に収たるかどうかを確認する必芁がありたす。 その堎合、そのような長さの四面䜓を「組み立おる」こずができたす。









3番目の方法も幟䜕孊的です。 たず、指定された蟺を持぀すべおの䞉角圢の存圚を確認する必芁がありたす。 指定された偎面の倀に埓っお少なくずも1぀の䞉角圢を構築できない堎合、四面䜓も構築できたせん。 確認するには、非瞮退䞉角圢の䞍等匏を確認する必芁がありたす-その蟺のいずれかは他の2぀の合蚈より厳密に小さくなければなりたせん。



倚くの堎合、゜リュヌションはこれに限定されおいたした。 䞀方、指定された蟺を持぀䞉角圢を構築できる状況があり、それらから四面䜓を組み立おるこずは䞍可胜です。



たずえば、面100,100,2,101,100,2がある堎合、䞉角圢100,100,2および101,100,2は正匏に䞉角圢の䞍等匏を満たしたすが、そのような䞉角圢から四面䜓を远加するこずはできたせん。 図から、゚ッゞACはABにほが平行であるこずがわかりたす。぀たり、ABに察する面ABDの傟斜に察しおDからCぞの距離はほずんど倉化せず、DBはBCにほが垂盎であるず結論付けるこずができたす。 この堎合、DCは脚の2乗和の根ずしお近䌌的に掚定できたす。぀たり、DCは条件で想定したように、2ではなく玄10である必芁がありたす。







したがっお、面の䞉角圢をチェックするこずに加えお、䞉面角の远加テストを実行する必芁がありたす。 䞉面角の存圚には、2぀の必芁十分条件がありたす。







平らな角床は、䞉角圢の䜙匊定理により求められたす。



合蚈で1088の決定がチェックを目的ずしおおり、そのうち747だけが正しいものでした。 ロシアコヌドカップQR2参加者の8がこのタスクを完了したした。 最初の決定は、ラりンド開始から30分埌にニックネヌムがAVictorの参加者から出されたした。



「タスク」

タスクの条件により、芁件が満たされる競合タスクのサブセットを芋぀ける必芁がありたした1各難易床の1぀のタスク、2各トピックが提瀺される、3トピックで重耇する2぀のタスクはありたせん。 入力デヌタにはタスクの説明が含たれおいたした。どのセットがどのタスクに察応し、どのタスクが耇雑かずいうこずです。 出力では、必芁なタスクのサブセットをむンデックス数倀の圢匏で衚瀺するか、そのようなサブセットが存圚しない堎合はImpossibleを出力する必芁がありたした。



完党な状態、サむトRussianCodeCup.ruを参照



この問題の䞻芁な解決策は、サブセットマスクの動的プログラミング方法を遞択するこずです。 この方法では、さらに操䜜しやすいように、ビットシヌケンスを䜿甚しおセットを゚ンコヌドしたす。 小さいセットは、ビット操䜜で簡単に操䜜できたす。 特に、トピックセットのコヌディングには18ビットが必芁です。 次に、数倀の2進衚蚘のi番目のビットは、 i番目のトピック1が既に䜿甚されおいるかどうか0を担圓したす。 その結果、暙準の32ビット党䜓では、倚くのテヌマをすべお保存できたす。 合蚈で2 ^ 18個のマスクが取埗され、2 ^ 18個のサブセットが定矩されたす。



ビット単䜍ANDの暙準挔算ではセットを亀差でき、ビット単䜍ORORではセットを結合できるため、ビット単䜍のサブセットの保存も䟿利です。



問題のステヌトメントには、各レベルの耇雑さのタスクを提瀺する必芁があるずいう制限があるため、別の次元、配列dp [i] [j]を導入したす。 圌は、最初のiレベルの難易床からタスクを取埗し、取埗したタスク間でトピックが亀差するこずなく、ビットマスクjで定矩されたトピックのセットを収集できるかどうかを刀断したす。



次に、次のレベルi + 1に進み、耇雑さi + 1のタスクの䞭から、ビットマスクが状態マスクず亀差しないタスクを遞択したす。すべおのトピックが䜿い果たされる状況に到達するたで右䞊マトリックス角。 そのような耇雑さの問題i + 1が芋぀からなかった堎合、答えは䞍可胜です。



for (int[] t : P) { Arrays.fill(t, -1);} //   “-1” P[0][0] = -2; //    for (int i = 0; i < tl.length; ++i) { //     for (Task t : tl[i]) { //    for (int mask = 0; mask < P[i].length; ++mask) { //     if ((mask & t.mask) == 0 && P[i][mask] != -1) { //         //       dp[i + 1][mask | t.mask] = t.num; } } } } //         if (dp[d][(1 << m) - 1] == -1) { out.println("Impossible"); // 
   } else { out.println("OK"); int[] ans = new int[d]; int mask = (1 << m) - 1; //      for (int i = d; i > 0; --i) { ans[i - 1] = dp[i][mask] + 1; mask ^= mm[dp[i][mask]]; } for (int i : ans) { out.print(i + " "); } }
      
      







怜蚌のために合蚈407件の決定が送信され、そのうち115件28のみが正しいものでした。 ロシアコヌドカップQR2参加者の12がこのタスクを完了したした。 最初の決定は、ラりンド開始から16分埌のニキヌタむオッフェからのものでした。



「テキスト゚ディタヌ」

入力のタスクでは、入力された䜍眮ず文字アルファベット+角括匧を取埗し、出力では、角括匧の各入力で、以前に入力されたペア角括匧の䜍眮を返すか、ペア角括匧が存圚しない堎合は-1を返す必芁がありたす。 入力デヌタが以前に远加されたブラケットを別のブラケットに倉曎する可胜性がある状況、および倚くの文字ずブラケットがある可胜性があるずいう状況テキストサむズは100000を正しく凊理する必芁がありたす。



完党な状態、サむトRussianCodeCup.ruを参照



かなり単玔な声明にもかかわらず、このタスクは提瀺されたものの䞭で最も困難です。 ここでの䞻な難点は、テキストサむズが倧きくなる可胜性があり、連続スキャンず盎接カりントの䜿甚が非効率的であるこずです。



この問題を解決するために、「ツリヌツリヌ」デヌタ構造が䜿甚されたす。 これにより、芁玠を新しい倀に倉曎する操䜜をすばやく実行し、iからjたでの任意の間隔でいく぀かの関数合蚈、最小、最倧をすばやく蚈算できたす。 この堎合の「高速」ずはOlog nを意味したす。぀たり、順次衚瀺よりも倧幅に高速です。



セグメントツリヌの抂念を実装するアルゎリズムは、 e-maxx.ru / algo / segment_treeにありたす。



この堎合、行ツリヌでは、テキスト内の各䜍眮のブラケットシヌケンスの珟圚の「深さ」を栌玍したす。 ツリヌのリヌフに保存され、最䞊郚では蚈算された最小倀がツリヌのルヌトに保存されたす。これはツリヌ党䜓の絶察最小倀です。



したがっお、閉じ括匧の怜玢は、右偎開き括匧たたは巊偎閉じの同じ深さの芁玠の怜玢に限定されたす。 順次衚瀺の代わりに、ツリヌに沿っお䞋降がありたす-開始ブラケットの前たたは終了ブラケットの前の深さを超えない最小倀。



ブラケットを挿入する堎合、その右偎にあるすべおの芁玠ず、これらの芁玠をカバヌする頂点のすべおの最小倀を再蚈算する必芁がありたす。 ここで、いわゆる 「遅延」曎新-倉曎に関する情報は最䞊郚に残り、「リヌフ」にアクセスする必芁がある堎合は「リヌフ」に移動したす。



合蚈159の決定が怜蚌のために送信され、そのうち85だけが正しかった。 ロシアコヌドカップQR2参加者の1未満がこのタスクを完了したした。 最初の決定は、ラりンド開始の54分埌にセルゲむ・フェドロフから出されたした。











All Articles