アップは非常に困難でした
- 必要でない場合は、ライン上の赤い豆の患者をSTL-ません
参照:https://www.cnblogs.com/Dillonh/p/11240083.html P:密かに注意削除されていない間、いくつかのテストが、理解しているようだ後に(2が、またあなたのホスピタリティエリアビットの見直しを続けます)
単峰シーケンスのHDU-6592ビューティ
括弧内のそのような調整は、他のアレイ等添字バグを再生し終えた後、最大のアレイサイズのDP WA点は、いくつかの0を作ることです
constのは間違いに一度のミスを戦うために、すべて間違っている、または各配列のサイズMAXNミスをXX、これは問題_です(:「з∠)_
ああああああ出力形式ひどく良いPEにも出品WA後
本体:POを初期化する時点では、まず、LIS走行の正側の配列、次いで逆ランは再び、添え字(P PPO陽性、OPOオーバー)に記録されています
オリジナルのブログは2つのベクトルを開け、小さな缶が添字変数を再利用することができます追加します(vはそれを呼ばれる)の配列を疑問に思いました。
最低注文TASK1辞書添字シーケンス - これを使用するので、一度見つけ、最小の辞書、ピークを探し始めます。そして、はるか前方LISの下で対象とピーク数から楽しみにして起動すると、最初のオリジナルのブログの状態を継続、気持ちは状況のようなものを持っていない見て、その後、飽くことのない(x)の第二を削除するために続けていきたいです、 (:з「∠)_出力ファイルこの問題の突然意識長い時間をチェックするためにしかし、二つ目は重い効果_を持つことです。フロントの上に戻ってチェックをチェックし、背中の部分は、インデックスが最小となるよう、彼らは、条件を満たしていました。そして、V出力スタックと離れて得るためにそれをシフトします。
タスク2辞書的に最大の添字のシーケンス - ピークを探し始めるが、それによってピークの後、可能な限り簡単に再初期化POを見つけました。楽しみにして、その添字の最大を見つけるためにかかりました。、振り返ってみると(スタックを使用してシミュレート逆ビーンvにファンを気)とタスク1と同様の操作の前半で行われます。出力ビン。
詳細については、コードを参照してください
#include <iostreamの> する#include <cstdioを> する#include <アルゴリズム> の#include <cmath> の#include <CStringの> する#include <積層> 使用して 名前空間STD。 typedefの長い 長いLL。 int型のn; int型 NUM [ 300005 ]、PPO [ 300005 ]、OPO [ 300005 ]、V [ 300005 ]、D [ 300005 ]、PO [ 300005 ]。 スタック < 整数 > SA; int型のmain() { 中(〜のscanf("%のD "& N)){ memsetの(D、0x3fを、はsizeofのD); dが[ 0 ] = 0 ; のための(int型 I = 1を iが<= N; iが++ ){ scanf関数(" %のD "、&NUM [I]); PPO [I] = LOWER_BOUND(D + 1、D + 1 + N、numは[I]) - D、 D [PPO [I] = NUM [I]、 PO [I] = 0x3f3f3f3f 。 } のmemset(D、0x3fを、はsizeofのD)。 D [ 0 ] = 0 ; 以下のために(int型 I = N; I> = 1 ; i-- ){ [i]はOPOの = LOWER_BOUND(D + 1、D + 1 + N、NUM [I]) - D。 D [OPO [I] = NUM [I]。 } INT CO = 0 。 INT今= 1、M = PPO [ 1 ] + OPO [ 1 ]。 用(int型 iは= 2 I ++; iが<= N。) であれば(PPO [I] + OPO [I]> M){今= I。M = OPO [I] + PPO [I]。} PO [PPO [今] = NUM [今]。 用(int型 -私は今= 1 ; I> = 1 ; i-- ){ 場合(PO [PPO [I] + 1 <= NUM [i])と続けます。 一方、(!sa.empty()&& PPO [I]> = PPO [sa.top()])PO [PPO [sa.top()]] = 0x3f3f3f3f 、sa.pop()。 sa.push(I); PO [PPO [I] = NUM [I]。 } 一方、 V [CO ++] =(sa.empty()!)sa.top()、sa.pop()。 V [CO ++] = 今; 用(int型 I =今+ 1 ; iが<= N iが++ ) 場合(OPO [I] == OPO [ - V [CO 1 - ] 1 && NUM [I] <NUM [V [CO - 1 ] )V [CO ++] = I。 以下のために(int型 i = 0 ; I <CO; iは++)のprintf(" %d個の%のC "、V [i]は、" \ n " [I == CO - 1 ])。 共同 = 0 ; 今 = 1 ; M = PPO [ 1] + OPO [ 1]。PO [ 1 ] = 0x3f3f3f3f 。 以下のために(int型 I = 2 ; iが<= N; iは++ ){ 場合(PPO [I] + OPO [I]> = M){今= I。M = OPO [I] + PPO [I]。} PO [I] = 0x3f3f3f3f 。 } sa.push(今)。 用(int型 -私は今= 1 ; I> = 1 ; i-- ) 場合(PPO [I] == PPO [sa.top()] - 1 && NUM [I] < NUM [sa.top()] )sa.push(I)。 しばらく(!sa.empty())V [共同++] =sa.top()、sa.pop()。 PO [OPO [今] = NUM [今]。 用(int型 I =今+ 1 ; iが<= N; iが++ ){ 場合(NUM [i]が> = PO [OPO [I] + 1 ])続けます。 一方、(CO && OPO [I]> = OPO [V [CO - 1 ])PO [OPO [V [CO - 1 ]]] = 0x3f3f3f3f、-CO- 。 V [共同 ++] = I; PO [OPO [I] = NUM [I]。 } のための(int型 I = 0 ; iがCOを<; Iは++)のprintf(" %d個%のC "、V [i]は、" \ n " [I == CO - 1 ])。 } 戻り 0 。 }
(新に書き込むべきかを考える前に、私は...それを考えると言うのを忘れて)