問題の意味
図5は、シーケンスをドロップし、最大(1からnまでのk)を取得しようとしないk個の要素の正面から撮影したn個の要素の列の数、所与の
分析
結果:[i]が、そのような "4,1,2" → "4,4,4,4,1,2,2" など、問題がに変換される数値は、[I]が[i]は、A、Aに分割されて考えてみましょう最大5つの共有要素は、要素の合計量までの配列を含有するように、配列を低下しません。ヤングチャート前に5層の長さの和に等しい、実証することができます。(手動で見つけることができるかのシミュレーション)
ヤングチャート答えを解く過程を考えてみましょう:
- 1からnまで順次に第一層のヤングチャートに挿入された配列内の各数値を考慮しています。
- Xを挿入するときxは、この層の最大数以上である場合、この層は、xの端に配置され; Xはそうでなければ、yの最小数を見つけるよりも大きい、YはX、Yで置き換えられ、下層に挿入されます。
各層の要素が順序付けられているので、あなたは、メンテナンスの配列を使用することができますし、バイナリ検索処理のyが加速することができる見つけること。
しかし、この質問のために、私たちは激しく[i]は番目の[I]を挿入することはできません。我々は使い捨てインサートX xを有する、とstd ::マップに挿入する必要があり、ときに各要素の個数、次いで引き続き同じ要素の各層は、STD ::マップレコードと組み合わされたヤン・テーブルを考えます「P、Q」は次の層に挿入されるように時間を短縮に後続低減するその後の消費、要素の数。各クラス番号の完全な消費を速やかにのstd ::マップから削除する必要があり、それぞれの挿入が原因となります後、それぞれの層が層の上に挿入の数は最大2倍になるように、他の数字の1は、分割されています。
Kは、答えは、この問題はk = 5において、時間複雑度が$ O(2 ^ KNログN)$であり、サブシーケンスを超えていなかったと仮定されます。
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 typedefの長い 長いLL。 CONSTの INT K = 5 。 地図 < int型、LL> T [K]。 ANS LL; int型のn; // 在第O行插入P个X 空隙インサート(INT O、INT X、LL P){ もし(O> = K)のリターン; T [O] [X] + = P。 ANS + = P; 一方、(P){ マップ < int型、LL> ::それはT [O] .lower_bound(X + =イテレータ1); もし(それ== T [O] .END())のリターン; LL T =分(P、IT-> 秒)。 ANS - = T; P - = T; インサート(O + 1、IT-> まず、T)。 もし(T == IT->秒)T [O] .erase(IT)。他の IT-> 2番目に= T; } } int型のmain() { int型のT。 scanf関数(" %のD "、&T)。 一方、(t-- ) { scanf関数(" %d個"、&N); ANS = 0 ; 以下のために(int型 i = 0 ; iはKを<; iは++ )T [i]を.clear(); 以下のために(int型 i = 1 ; iが++; iが<= N ) { int型TMP。 scanf関数(" %のD "、&TMP)。 インサート(0 、TMP、TMP)。 printf(" %のLLDの%のC "、ANS、私は== N?' \ nは':' ' ); } } リターン 0 ; }